2017-03-15 3 views
3

私はdataframeを持っています。列の1つは、各観測行列のための遷移行列を定義する行列です。グループ化係数によってdata.frameの行列のリスト列を合計します。

library(tidyverse) 
m <- matrix(1:4, ncol = 2) 
d <- data_frame(g = c('a', 'a', 'b', 'b', 'b', 'c'), 
       m = rep(list(m), 6)) 

これは次のようになります。それぞれのグループ化因子のすべての行列の和であることa、私は2つの行列のリストを取得したい

# A tibble: 6 × 2 
     g    m 
    <chr>  <list> 
1  a <int [2 × 2]> 
2  a <int [2 × 2]> 
3  b <int [2 × 2]> 
4  b <int [2 × 2]> 
5  b <int [2 × 2]> 
6  c <int [2 × 2]> 

b。私はグループ化の要素の数を事前に知らないので、任意の数のグループに一般化するにはこの方法が必要です。

私はby_slicedoを試してみましたが、私は出力に管理することができ、すべてがすべての行列の合計、または単独のいずれかaまたはb行列の和である - 単一のグループにバインドされていません。

答えて

6

マトリクスのリストを含むリスト列を作成する(tidyrのnestを持つ)グループ内にマトリクスを入れ子にすることで、これを行うことができます。その後、各グループのリスト内の行列を合計するpurrrのmapreduceを使用することができます。

results <- d %>% 
    nest(-g) %>% 
    mutate(summed = map(data, ~ reduce(.$m, `+`))) 

結果:

# A tibble: 3 × 3 
     g    data  summed 
    <chr>   <list>  <list> 
1  a <tibble [2 × 1]> <int [2 × 2]> 
2  b <tibble [3 × 1]> <int [2 × 2]> 
3  c <tibble [1 × 1]> <int [2 × 2]> 

summed列には、行列は、各グループ内で加算されます。


あなたは行列の/ B/Cの項目に名前付きリストにこれを有効にしたい場合は、あなたができる:

lst <- results$summed 
names(lst) <- results$g 
lst 

または代わり:

results %>% 
    select(-data) %>% 
    spread(g, summed) 
3

別の方法group_bysummarise、およびreduce

m_sum <- function(l) { 
    reduce(l, `+`) %>% list() 
} 

group_by(d, g) %>% 
    summarise(m_sum = m_sum(m)) %>% 
    select(m_sum) %>% 
    unlist(recursive = FALSE) 
関連する問題