2017-05-24 13 views
1

特定の行の「チャンク」に対してのみ、applyを使用して特定の関数を適用する方法を見つけるのには苦労しています。例えば は、私が行列を有する: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 

を私は新しいマトリックスで終わるしたい、各行の最初と最後の2つの値の和で構成される。これと同じように:

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] [,2] 
[1,] 8 11 
[2,] 14 18  
[3,] 12 15  

私はこのような何かを試してみました。成功した方法に関する提案はありますか? ありがとうございます。

答えて

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:ここ
はベクトル化変種です。実際に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 

は最終的に、あなたは結果を移調したいです。私は、これは、詳細なRコードでの質問への答えではなく、明確化のための要求であると仮定し

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 
関連する問題