【问题标题】:R list of data frames to data frameR数据帧列表到数据帧
【发布时间】:2017-06-27 18:27:22
【问题描述】:

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

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

如果也有解决方案来扭转这一点,我们将不胜感激,因此请从数据框返回原始列表。

【问题讨论】:

  • 搜索“宽格式”和“长格式”
  • 实际上我已经尝试过 reshape2 melt 和 dcast,感觉 c(或日期列)给我带来了困难,但谢谢,会调查更多。

标签: r list dataframe


【解决方案1】:

你可以试试dcast()

但首先,需要使用包data.table 中的rbindlist() 将数据帧列表合并为一个。

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

【讨论】:

  • 谢谢,我尝试一次解决单个列表。知道如何逆转吗?
  • @Viitama 添加了反向操作。这适合你吗?还是您需要再次将其拆分为单个数据帧?
  • 将从该列表格式中恢复。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2019-11-05
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
相关资源
最近更新 更多