如何使用R功能自动执行此类操作?我知道如果row1和row2相隔一位,怎么办呢,但我能想到跳过这样的值的唯一方法就是使用一个全局变量(尽管事实上每次偏移都是5)。有人可以提出更好的方法吗?这只是一个片段,我必须执行此任务近2000次
cond<-rbind(c(1,2,3),c(4,5,6),c(9,9,9),c(9,9,9),c(9,9,9),c(9,9,9),c(7,8,9))
row1<-rbind(cond[c(1,2),])
avatar10<-matrix(colMeans(row1), ncol=3, byrow = TRUE)
row2<-rbind(cond[c(6,7),])
avatar20<-matrix(colMeans(row2), ncol=3, byrow = TRUE)
result<-rbind(avatar10,avatar20)
答案 0 :(得分:1)
您可以使用rowsum
。
这是一个例子,只是为了确保我们谈论同样的事情:
set.seed(1)
n <- 5
nr <- 50
dat <- replicate(3, rnorm(nr))
idx <- sapply(seq(1, nr-1, by=n), `+`, 0:1)
idx
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 1 6 11 16 21 26 31 36 41 46
# [2,] 2 7 12 17 22 27 32 37 42 47
所以,你想要对第1行和第2行,第6行,第7行,第11行和第12行等进行比较。
res = rowsum(dat[c(idx),], c(col(idx))) / nrow(idx)
# [,1] [,2] [,3]
# 1 -0.22140524 -0.10696026 -0.2891254
# 2 -0.16651967 0.80658921 1.2419974
# 3 0.95081220 1.18118888 -0.5486906
# 4 -0.03056194 -0.80808316 -0.3564004
# 5 0.85055684 -0.11721845 0.4185407
# 6 -0.10596212 -0.07592282 0.3195510
# 7 0.62794591 -0.35192367 -0.2643670
# 8 -0.40464226 0.69802510 -0.9187130
# 9 -0.20894264 0.33267389 -0.3688881
# 10 -0.17145660 -0.35905289 0.6681738
# for comparison, the first row computed manually
colMeans(dat[c(1,2),])
# [1] -0.2214052 -0.1069603 -0.2891254
rowsum
是一个非常奇怪的名称,但在?rowsum
的文档中对此进行了解释。