2016-08-02 8 views
0

のリストからすべての要素をrbinding(DFS、行列、ベクトル、など)私はこのようなリストのリストを持っている:私は最初の名前を追加しているしたいと思っ何命名し、リスト

# output from a package function 
A <- list(a = matrix(1:9,ncol=3), 
      b = matrix(1:8,ncol=4), 
      c = 1.5) 

B <- list(a = matrix(11:19,ncol=3), 
      b = matrix(11:18,ncol=4), 
      c = 2.5) 

# list with all outputs (from loaded=lapply(filenames, function(x) get(load(x)))) 
superlist <- list(A, B)) 

各リストアイテム(A、B)をすべての2次リスト要素に割り当てる。例えば、Bはなる:

B <- list(a = cbind(matrix(11:19,ncol=3),c("B","B","B")), 
      b = cbind(matrix(11:18,ncol=4),c("B","B")), 
      c = c(2.5,"B")) 

そして、その目的は、(A、B、C)と同じ名前を一緒にすべての行列、値またはデータフレームをrbindすることで、私が持っているであろうように:

superlist <- list(a = rbind(cbind(matrix(1:9,ncol=3),c("A","A","A")),cbind(matrix(11:19,ncol=3),c("B","B","B"))), 
      b = rbind(cbind(matrix(1:8,ncol=4),c("A","A")),cbind(matrix(11:18,ncol=4),c("B","B"))), 
      c = rbind(c(1.5,"A"),c(2.5,"B"))) 

do.call("rbind",lapply(superlist ,function(x) x[["a"]])) 

しかし、それは唯一のリスト要素のためにそれをしない(と私は20以上のものを持っている):rbinding用

は、私が得た最高のは、この(rbind all dataframes in a list of lists by nameから)です。私はループを書くことができることを知っていますが、私がこの機能を頻繁に使用するようになると、これをもっとうまくやる方法を知りたいと思います。

これについて複数の質問がありますが、どれも全く同じ問題がないことを認識しています(たとえば、リスト要素のリストとしてのデータフレーム、場合によってはすべて同じサイズのデータ​​フレームのみ)。だから、特定の質問が少しの助けをもたらしたにもかかわらず、本当に私の問題を解決するのに十分な情報をくれた人はいなかった。第二のリストではなく、最初の

  • Convert a list of data frames into one data frame#1つのリストだけ
  • rbinding a list of lists of dataframes based on nested order
  • によって

    あなたは

  • +0

    "まず、各リスト項目(A、B)の名前を2番目のすべてのリスト要素に追加します。 - しないでください。 'cbind(行列11:19、ncol = 3)、c(" B "、" B "、" B "))のような名前の文字をデータの中に混入させようとしています。 – Frank

    答えて

    0

    私ができると思いますありがとうございました答えはthisで提案された機能を利用する。これは、リスト構造、すなわち内部リストによるグループを逆転させる。例:

    # output from a package function 
    A <- list(a = matrix(1:9,ncol=3), 
         b = matrix(1:8,ncol=4), 
         c = 1.5) 
    
    B <- list(a = matrix(11:19,ncol=3), 
         b = matrix(11:18,ncol=4), 
         c = 2.5) 
    
    # list with all outputs (from loaded=lapply(filenames, function(x)  get(load(x)))) 
    superlist <- list(A, B) 
    ################### your code above ############## 
    ## the function from the linked answer 
    fun <- function(ll) { 
        nms <- unique(unlist(lapply(ll, function(X) names(X)))) 
        ll <- lapply(ll, function(X) setNames(X[nms], nms)) 
        ll <- apply(do.call(rbind, ll), 2, as.list) 
        lapply(ll, function(X) X[!sapply(X, is.null)]) 
    } 
    
    ## apply the function to your list 
    insideout <- fun(superlist) 
    
    ## rbind the components together 
    lapply(insideout, function(x) do.call(rbind, x)) 
    

    これは意図したとおりですか?

    +0

    はいこれは素晴らしい作品です!しかし、あなたは名前(私の質問の最初の部分)を持つ列を追加する方法も知っていますか?フランクの言葉通り、「マトリックスが汚染されていますが、それについては気にしません(後でラベルは「汚染」よりも重要です)。 – Wave

    +0

    これは自動的に名前を「A "と" B "はあなたによって選択され、あなたのデータには関係ありません(少なくともあなたの例では) また、フランクに同意します。名前の列を追加するか、行列にrownamesを使用します。 – AEF