2017-03-19 8 views
1

これはおそらく簡単な質問ですが、私のR経験のほとんどはデータフレームとdplyrです。私はリストのリストを持っています。内側のリストには、「情報」データフレームと「結果」データフレームが含まれています(下の例を参照)。R:データフレームの2Dリストを1つのデータフレームに再編成

# Sample code for my data structure 
data <- list(
    list(data.frame(subject = "A", year = 2016), 
     data.frame(results = c(1, 2, 3), time = c(4, 5, 6)) 
), 
    list(data.frame(subject = "B", year = 2017), 
     data.frame(results = c(7, 8, 9), time = c(10, 11, 12)) 
) 
) 

これは内側のリストのデータを分析するのには優れていますが、私は 'クロスリスト'分析を行うのに苦労しました。私がしようとしているのは、以下のように自分のデータを作り直すことです。

# Dataframes in lists in lists (current) 
    [[1]] 
    [[1]][[1]] 
     subject year 
    1  A 2016 
    [[1]][[2]] 
     results time 
    1  1 4 
    2  2 5 
    3  3 6 
    [[2]] 
    [[2]][[1]] 
     subject year 
    1  B 2017 
    [[2]][[2]] 

# Single dataframe (goal) 
     subject year results time 
    1  A 2016  1 4 
    2  A 2016  2 5 
    3  A 2016  3 6 
    4  B 2017  7 10 
    5  B 2017  8 11 
    6  B 2017  9 12 

私はすでにオンラインで検索しましたが、解決策のほとんどはデータフレームではないリストのリストの単一のリストです。

実際のデータはであり、多くの場合は(行と列の両方)が大きいので、私はこれまでのforループを使用しています(行と列の両方)。

df = data.frame() 
for (i in (1:length(data))) { 
    df = rbind(df, 
      cbind(data[[i]][[1]], data[[i]][[2]])) 
} 

乾杯!

答えて

2

あなたはdplyrに精通しているので、これを試してみてください。

bind_rows(lapply(data,function(i)do.call(cbind,i))) 

PS。 bind_colsがうまく動作しないことがわかりました。たぶんそれは少しバグですか?

1

は次のようになります。

do.call(rbind, lapply(1:length(data), 
         function(i) do.call(cbind, data[[i]]) 
        ) 
     ) 
1

パッケージ:data.table rbindlist(...、fill = TRUE)でこれをうまく処理します。完了したらdata.frameに戻してください。

関連する問題