2017-05-24 15 views
1

我在努力找到一种方法使用申请,只对特定行的“块”申请一个特定的功能。 举例来说,我有一个矩阵:应用功能,各行的子集R中

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

} 

不过,这并不在所有的工作。任何关于成功方式的建议? 谢谢。

回答

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 
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)) 
+0

@JoshuaDrake我想这是一个答案为与详细R代码里面的问题,但不能用于澄清的请求。其实,OP让问题变得非常清楚,没有必要进一步澄清。 –

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 
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