我正在努力寻找一种方法来使用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]])
}})
}
但它根本不起作用。有关成功方法的任何建议吗? 谢谢。
答案 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