我很难理解列表和数据框之间的转换。我将列出我想要实现的简单例子。我有数据框列表,它是时间点的快照。
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
请注意,如果有解决方法也可以将其反转,那么请从数据框回到原始列表。
答案 0 :(得分:1)
您可以尝试dcast()
。
但首先,需要使用包rbindlist()
中的data.table
将数据框列表合并为一个。
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
虽然仍然合并在一个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
是判别变量。