有没有办法跳过lapply中的行来自动执行任务?

时间:2015-11-06 16:54:03

标签: r

如何使用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)

1 个答案:

答案 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的文档中对此进行了解释。