R数据帧列表到数据帧

时间:2017-02-09 16:26:23

标签: r list dataframe

我很难理解列表和数据框之间的转换。我将列出我想要实现的简单例子。我有数据框列表,它是时间点的快照。

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

请注意,如果有解决方法也可以将其反转,那么请从数据框回到原始列表。

1 个答案:

答案 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是判别变量。