2017-04-02 9 views
0

プログラムからネストされたリストが出ています。その長さは100です。第1行のすべての要素と第2行のすべての要素を合計する必要があります。ここでは小さな再現可能な例です。私が必要とするのは、1 + 3 + 5 + 7 = 16の和と2 + 4 + 6 + 8 = 20の和です。Rのネストされたリストの行の合計R

l1<-as.matrix(c(1,2)) 
l2<-as.matrix(c(3,4)) 
l3<-as.matrix(c(5,6)) 
l4<-as.matrix(c(7,8)) 
ll1<-list(l1,l2) 
ll2<-list(l3,l4) 
lll<-list(ll1,ll2) 

    lll 
[[1]] 
[[1]][[1]] 
     [,1] 
[1,] 1 
[2,] 2 

[[1]][[2]] 
     [,1] 
[1,] 3 
[2,] 4 


[[2]] 
[[2]][[1]] 
     [,1] 
[1,] 5 
[2,] 6 

[[2]][[2]] 
     [,1] 
[1,] 7 
[2,] 8 
私たちは、その後、 cbind listの要素を do.call(cを使用して、単一 listにネストされた listを除去することにより、 base Rでこれを行うと取得することができます
+0

私はhaputを使用していましたが、確認できます。小さな例で再現可能なコードがあります。 – user24318

答えて

1

rowSums

rowSums(do.call(cbind, do.call(c, lll))) 
#[1] 16 20 

あるいは 私達ができるunlist 2列のmatrixを作成し、colSums

を取得しますベースRで
colSums(matrix(unlist(lll), ncol=2, byrow=TRUE)) 
#[1] 16 20 
1

Reduce:に基づいて

library(magrittr) #for pipes 
library(purrr) #for flatten 
lll %>% flatten %>% as.data.frame %>% rowSums 

Reduce("+", lapply(Reduce(c, lll), rowSums)) 
#[1] 16 20 
2

それが唯一のリストの階層の1つのレベルを除去するので、私は機能flatten()ためpurrrパッケージが役に立ったと評価していakrunの回答はdo.call(c, lll)と似ています。

関連する問題