2017-06-14 71 views
7

我有一個這樣的矩陣:合併基於值列在索引在單獨的載體

> y 
    [,1] [,2] [,3] [,4] 
[1,] 17 14 5 8 
[2,] 7 2 17 2 
[3,] 10 18 6 6 
[4,] 6 11 4 11 
[5,] 5 9 4 9 

和向量​​

> group 
[1] 1 2 2 3 

該組向量指示第1列是在第1組,第2列和第3列在第2組中,第3列在第3組中。我想在y中組合列(通過加法),以便將分配給特定組的所有列相加,即,使得我得到:

 [,1] [,2] [,3] 
[1,] 17 19 8 
[2,] 7 19 2 
[3,] 10 24 6 
[4,] 6 15 11 
[5,] 5 13 9 

我一直在與子集,合併和減少,但我真的沒有得到任何地方。

回答

5

我們可以做

sapply(split(seq_along(group), group), function(x) rowSums(y[, x, drop = FALSE])) 
#  1 2 3 
#[1,] 17 19 8 
#[2,] 7 19 2 
#[3,] 10 24 6 
#[4,] 6 15 11 
#[5,] 5 13 9 

或者另一種選擇是rowsum

t(rowsum(t(y), group)) 
#  1 2 3 
#[1,] 17 19 8 
#[2,] 7 19 2 
#[3,] 10 24 6 
#[4,] 6 15 11 
#[5,] 5 13 9 
+1

正是我需要的,以及+1對於對我有用的基本R解決方案。 – smiley

1

這裏有一個dplyr方式:

data.frame(group = group, t(y)) %>% 
    group_by(group) %>% 
    summarise_each(funs(sum), -group) %>% 
    ungroup() %>% 
    select(-group) %>% 
    as.matrix() %>% 
    t() 

看,我們轉y並將其作爲單獨的列與group作爲data.frame。然後,我們可以自由選擇組中每列的group_by &總和。最後四步是將結果轉換回您想要的格式。