2017-02-09 17 views
1

リストとデータフレーム間の変換を理解するのは本当に問題です。私は達成しようとしている簡単な例を描きます。私はポイントのスナップショットであるデータフレームのリストを持っています。Rデータフレームからデータフレームへのリスト

my_list <- list(data.frame(a = 1:5, b = c("a", "b", "c", "d", "f"), c= c("2015-01-01", "2015-01-01", "2015-01-01", "2015-01-01", "2015-01-01")), 
       data.frame(a = 1:5, b = c("a", "b", "c", "d", "f"), c= c("2015-02-01", "2015-02-01", "2015-02-01", "2015-02-01", "2015-02-01"))) 

これを次のデータフレームに変換したいと思います。

  a b c d f 
2015-01-01 1 2 3 4 5 
2015-02-01 1 2 3 4 5 

これを逆にするソリューションがある場合は、データフレームから元のリストに戻ってください。

+3

「ワイドフォーマット」と「ロングフォーマット」を検索 – Bernhard

+0

実際に私はreshape2のメルトとdcastで試してみましたが、c(または日付カラム)は苦労しますが、もっと感謝します。 – Viitama

答えて

1

dcast()を試すことができます。

しかし、まず、data.tablerbindlist()を使用してデータフレームのリストを1つに結合する必要があります。

library(data.table) 
dt_long <- rbindlist(my_list) 
dt_long 
# a b   c 
# 1: 1 a 2015-01-01 
# 2: 2 b 2015-01-01 
# 3: 3 c 2015-01-01 
# 4: 4 d 2015-01-01 
# 5: 5 f 2015-01-01 
# 6: 1 a 2015-02-01 
# 7: 2 b 2015-02-01 
# 8: 3 c 2015-02-01 
# 9: 4 d 2015-02-01 
#10: 5 f 2015-02-01 

dt_wide <- dcast(dt_long, c ~ b, value.var = "a") 
dt_wide 
#   c a b c d f 
#1: 2015-01-01 1 2 3 4 5 
#2: 2015-02-01 1 2 3 4 5 

逆の動作がmelt()ある:

melt(dt_wide, id.vars = "c", variable.name = "b", value.name = "a") 
#    c b a 
# 1: 2015-01-01 a 1 
# 2: 2015-02-01 a 1 
# 3: 2015-01-01 b 2 
# 4: 2015-02-01 b 2 
# 5: 2015-01-01 c 3 
# 6: 2015-02-01 c 3 
# 7: 2015-01-01 d 4 
# 8: 2015-02-01 d 4 
# 9: 2015-01-01 f 5 
#10: 2015-02-01 f 5 

依然として1 data.tableで組み合わせているが、以下のように、順序付けられた列と行を調整することができる。

setcolorder(dt_long2, letters[1:3]) 
dt_long2[order(c, a)] 
# a b   c 
# 1: 1 a 2015-01-01 
# 2: 2 b 2015-01-01 
# 3: 3 c 2015-01-01 
# 4: 4 d 2015-01-01 
# 5: 5 f 2015-01-01 
# 6: 1 a 2015-02-01 
# 7: 2 b 2015-02-01 
# 8: 3 c 2015-02-01 
# 9: 4 d 2015-02-01 
#10: 5 f 2015-02-01 

完了するに逆の操作では、大きいdata.tableは、小さいもののリストで分割することができます。

lapply(unique(dt_long2$c), function(x) dt_long2[c == x]) 
#[[1]] 
# a b   c 
#1: 1 a 2015-01-01 
#2: 2 b 2015-01-01 
#3: 3 c 2015-01-01 
#4: 4 d 2015-01-01 
#5: 5 f 2015-01-01 
# 
#[[2]] 
# a b   c 
#1: 1 a 2015-02-01 
#2: 2 b 2015-02-01 
#3: 3 c 2015-02-01 
#4: 4 d 2015-02-01 
#5: 5 f 2015-02-01 

ここでは、cが弁別変数であると仮定する。

+0

ありがとう、私は個人のリストを一度に1つずつ解決しようとしました。どのように逆転するのか考えていますか? – Viitama

+0

@Viitama逆の操作を追加しました。これはあなたのためにOKですか?またはこれを単一のデータフレームで分割する必要がありますか? – Uwe

+0

はそれをリスト形式で元に戻します。ありがとう! – Viitama

関連する問題