将函数应用于R中每行的子集

时间:2017-05-24 13:05:11

标签: r apply

我正在努力寻找一种方法来使用apply来应用特定的功能,只能用于" chunk"特定行的。 例如,我有一个矩阵:

x <- matrix(c(5,12,4,3,2,8,10,7,9,1,11,6),nrow=3)


    [,1] [,2] [,3] [,4]
[1,]    5    3   10    1
[2,]   12    2    7   11
[3,]    4    8    9    6

我想最终得到一个新矩阵,由每行中第一个和最后两个值的总和组成。像这样:

       [,1] [,2] 
[1,]    8    11   
[2,]   14    18    
[3,]   12    15    

我尝试过这样的事情:

chunks<-c("1:2","3:4")

 sumchunks<-function(x,chunks){
  apply(x,1,
        function(row){
          for (i in chunks){
            v<-sum(row[chunks[i]])
          }})

}

但它根本不起作用。有关成功方法的任何建议吗? 谢谢。

4 个答案:

答案 0 :(得分:2)

你可以这样做:

chunks <- list(1:2, 3:4)
sumchunks <- function(x, chunks) sapply(chunks, function(ch) sum(x[ch]))

x <- matrix(c(5,12,4,3,2,8,10,7,9,1,11,6),nrow=3)
apply(x, 1, sumchunks, chunks=chunks)
#      [,1] [,2] [,3]
# [1,]    8   14   12
# [2,]   11   18   15

最终你要转置结果。
这是一个矢量化变体:

chunks <- list(1:2, 3:4)
x <- matrix(c(5,12,4,3,2,8,10,7,9,1,11,6),nrow=3)
sapply(chunks, function(ch) rowSums(x[,ch]))
#      [,1] [,2]
# [1,]    8   11
# [2,]   14   18
# [3,]   12   15

答案 1 :(得分:1)

我们可以转换为array,然后执行

t(apply(array(x, c(3, 2, 2)), 1, colSums))

或者

sapply(seq(1, ncol(x), 2), function(i) rowSums(x[,i:(i+1)]))
#     [,1] [,2]
#[1,]    8   11
#[2,]   14   18
#[3,]   12   15

答案 2 :(得分:1)

像这样?

x <- matrix(sample(1:12),nrow=3)
f = function(s) {
    c(sum(s[1:2]), sum(s[3:4]))
}
t(apply(x, 1, f))

答案 3 :(得分:1)

rowSums是为了对行进行求和而构建的,所以应该非常快。您可以限制要汇总的列,然后cbind它们以获得您想要的内容:

cbind(rowSums(x[,c(1,2)]), rowSums(x[,c(3,4)]))

#    [,1] [,2]
#[1,]    8   11
#[2,]   14   18
#[3,]   12   15