r - কোনও ভেক্টরে বাম এবং ডান প্রতিবেশীদের মধ্যম গণনা করার জন্য ভেক্টরাইজড উপায়




(4)

এর কিছু সহজ সমাধান হওয়া উচিত তবে এখানে zoo::rollapply ব্যবহার করার এক উপায়। আমরা ভেক্টরের দৈর্ঘ্যের জন্য বিজোড় এবং এমনকি সূচকগুলির একটি ক্রম তৈরি করি, 2 পয়েন্ট ঘূর্ণায়নের জন্য সাবসেট x এবং সেগুলির mean গ্রহণ করি।

a1 <- zoo::rollapply(seq(2, length(x), by = 2), 2, function(i) mean(x[i]))
a2 <- zoo::rollapply(seq(1, length(x), by = 2), 2, function(i) mean(x[i]))
c(rbind(a1, a2))

#[1] 2407.50 2177.00 2448.50 2428.00 2331.00 2326.50 2305.00 2318.00 2277.00 
#    2291.00 2338.00 2307.50 2321.50 2245.00 2423.00 2256.00 2529.00 2444.50 
#    2688.50 2652.50 2995.00 2896.50 3118.50 3067.75 3183.75 3228.25

আমার একটি ভেক্টর আছে

x = c(1820.0, 2235.0, 2534.0, 2580.0, 2322.0, 2317.0, 2331.0, 2345.0, 
      2305.0, 2265.0, 2277.0, 2289.0, 2338.0, 2387.0, 2152.0, 2256.0, 
      2360.0, 2590.0, 2529.0, 2468.0, 2776.0, 2909.0, 3017.0, 3081.0,
      3118.5, 3156.0, 3338.0, 3211.5)

আমি প্রান্তগুলি ব্যতীত প্রতিটি উপাদানের বাম এবং ডান প্রতিবেশীদের গড় গণনা করতে চাই। উদাহরণস্বরূপ, ফলাফলটি এর মতো হওয়া উচিত: mean(1820,2534), mean(2235,2580), mean(2534,2322) ...

আমি লুপগুলি ব্যবহার করে এটি করতে সক্ষম কিন্তু এটি খুব ধীর। আমার একটি ভেক্টরাইজড দ্রবণ দরকার need

লুপের জন্য আমার কোডটি ব্যবহার করে:

neighbour_m = function(x) {
  newx = c(x[length(x)], x, x[1])
  for (i in 2:(length(newx) - 1)){
    m = mean(c(newx[i-1], newx[i+1]))
  }
}

ডিপিপ্লায়ার থেকে পিছিয়ে / lead ব্যবহার:

library("dplyr")
na.omit(rowMeans(data.frame(lag(x, 1), lead(x, 1))))
#  [1] 2177 2408 2428 2448 2326 2331 2318 2305 2291 2277 2308 2338 2245 2322 2256
# [16] 2423 2444 2529 2652 2688 2896 2995 3068 3118 3228 3184
# attr(,"na.action")
# [1]  1 28
# attr(,"class")
# [1] "omit"

rowMeans এবং cbind ব্যবহার করে অন্য একটি বেস আর বিকল্প

rowMeans(cbind(x[1:(length(x) - 2)], x[3:(length(x))]))
# [1] 2177.00 2407.50 2428.00 2448.50 2326.50 2331.00 2318.00 2305.00 2291.00
#[10] 2277.00 2307.50 2338.00 2245.00 2321.50 2256.00 2423.00 2444.50 2529.00
#[19] 2652.50 2688.50 2896.50 2995.00 3067.75 3118.50 3228.25 3183.75

মাথা , লেজ এবং তারপরে সারি ম্যান ব্যবহার করুন :

rowMeans(cbind(head(x, -2), tail(x, -2)))
#  [1] 2177.00 2407.50 2428.00 2448.50 2326.50 2331.00 2318.00 2305.00
#  [9] 2291.00 2277.00 2307.50 2338.00 2245.00 2321.50 2256.00 2423.00
# [17] 2444.50 2529.00 2652.50 2688.50 2896.50 2995.00 3067.75 3118.50
# [25] 3228.25 3183.75

একইভাবে:

colMeans(rbind(head(x, -2), tail(x, -2)))



r  

r