繁体   English   中英

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

[英]apply function to subsets of each row in R

我正在努力寻找一种方法,该方法使用apply仅将特定功能应用于特定行的“块”。 例如,我有一个矩阵:

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]])
          }})

}

但这根本不起作用。 关于成功方法有什么建议吗? 谢谢。

你可以做:

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

我们可以转换为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

像这样?

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

rowSums用于对行进行求和,因此应该非常快。 您可以限制要累加的列,然后对其进行cbind以获得所需的内容:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM