【问题标题】:In R: How to join all data frames with a similar name?在 R 中:如何连接具有相似名称的所有数据框?
【发布时间】:2018-11-20 21:24:45
【问题描述】:

目前,使用for loop,我吐出了多个数据帧,都带有名称

res_[Insert some date] 

例如在我的环境中:

res_2018-04-01

res_2018-05-01

res_2018-06-01

每个数据框都有 1 行 25 列。第一列是文件上传的日期(因此对于第一个数据框,该列的值为 2018-04-11),随后的列是文件上传日期之前的 24 个月。

在 for 循环运行后,我想合并所有创建的数据框,而无需手动输入这些数据框的名称。因此,例如,我可以合并所有名称为 res_%

的数据框

所以我的最终数据框将有 27 列和(在本例中)3 行。

有什么建议吗?

编辑:这是 dput(res_2018-04-11) 的输出

dput(`res_2018-04-11`)
structure(list(UploadDate = "2018-04-11", `2016-03-01` = 4822598.18735351, 
`2016-04-01` = 4022970.75519652, `2016-05-01` = 4471569.0873137, 
`2016-06-01` = 4762693.19167908, `2016-07-01` = 3799649.58966077, 
`2016-08-01` = 4667486.94228869, `2016-09-01` = 4748252.38636671, 
`2016-10-01` = 3953585.1499195, `2016-11-01` = 5258338.05699641, 
`2016-12-01` = 4529140.27998058, `2017-01-01` = 3334021.87730489, 
`2017-02-01` = 4842435.58785495, `2017-03-01` = 5430798.18389053, 
`2017-04-01` = 4045150.70691188, `2017-05-01` = 4660901.62683975, 
`2017-06-01` = 4684489.25953388, `2017-07-01` = 3680375.93521103, 
`2017-08-01` = 5231564.19023014, `2017-09-01` = 4073906.09821191, 
`2017-10-01` = 5440655.92109229, `2017-11-01` = 4996844.57817061, 
`2017-12-01` = 5087355.28846096, `2018-01-01` = 2895616.00464724, 
`2018-02-01` = 3766770.55063743), .Names = c("UploadDate", 
"2016-03-01", "2016-04-01", "2016-05-01", "2016-06-01", "2016-07-01", 
"2016-08-01", "2016-09-01", "2016-10-01", "2016-11-01", "2016-12-01", 
"2017-01-01", "2017-02-01", "2017-03-01", "2017-04-01", "2017-05-01", 
"2017-06-01", "2017-07-01", "2017-08-01", "2017-09-01", "2017-10-01", 
"2017-11-01", "2017-12-01", "2018-01-01", "2018-02-01"), row.names = c(NA, 
-1L), class = "data.frame")

【问题讨论】:

  • 如果您在问题中分享来自dput(res_2018-04-01)dput(res_2018-05-01)dput(res_2018-06-01) 的输出,将会很有用。
  • 首先,将它们放在一个列表中:my_list = mget(ls("res_.*")),然后是use your favorite of these answers。请注意,如果您从一开始就将它们放在list 中,那么您使用for 循环来制作这些数据帧可能会被简化。见my answer here for details
  • 虽然“合并”似乎是指“堆栈”-merge 是进行连接的基本 R 函数,但您可能只需要 rbinddo.call(rbind, my_list)(这是我之前评论的第二个链接中使用的示例)。
  • 这是有道理的。但是当我运行do.call(rbind, my_list) 时,它给了我 1 列 75 行。我需要 27 列 3 行
  • 获得列表后,您可以使用plyr::rbind.fill,如本问题所述:stackoverflow.com/questions/3402371/…

标签: r date dataframe merge


【解决方案1】:

在您的问题中提供一个最小的工作示例通常很有用。这是一个例子。在这里,我只使用 3 列而不是 24 列数据,但它显示了相同的点:

`res_2018-04-11` <- structure(list(UploadDate = "2018-04-11", 
`2017-12-01` = 5087355.28846096, `2018-01-01` = 2895616.00464724, 
`2018-02-01` = 3766770.55063743), .Names = c("UploadDate", "2017-12-01", 
"2018-01-01", "2018-02-01"), row.names = c(NA, -1L), class = "data.frame")

`res_2018-03-09` <- structure(list(UploadDate = "2018-03-09", 
`2017-11-01` = 4996844.57817061, `2017-12-01` = 5087355.28846096, 
`2018-01-01` = 2895616.00464724), .Names = c("UploadDate", "2017-11-01", 
"2017-12-01", "2018-01-01"), row.names = c(NA, -1L), class = "data.frame")

`res_2018-02-12` <- structure(list(UploadDate = "2018-02-12", 
`2017-10-01` = 5440655.92109229, `2017-11-01` = 4996844.57817061, 
`2017-12-01` = 5087355.28846096), .Names = c("UploadDate", "2017-10-01", 
"2017-11-01", "2017-12-01"), row.names = c(NA, -1L), class = "data.frame")

然后,正如 @Gregor 在 cmets 中提到的,创建一个数据帧列表,指定 pattern 参数:

df_list <- mget(ls(pattern = "^res_.*"))

现在使用plyr 包中的rbind.fill

plyr::rbind.fill(df_list)
#   UploadDate 2017-10-01 2017-11-01 2017-12-01 2018-01-01 2018-02-01
# 1 2018-02-12    5440656    4996845    5087355         NA         NA
# 2 2018-03-09         NA    4996845    5087355    2895616         NA
# 3 2018-04-11         NA         NA    5087355    2895616    3766771

或者,使用dplyr 包:

dplyr::bind_rows(df_list)
#   UploadDate 2017-10-01 2017-11-01 2017-12-01 2018-01-01 2018-02-01
# 1 2018-02-12    5440656    4996845    5087355         NA         NA
# 2 2018-03-09         NA    4996845    5087355    2895616         NA
# 3 2018-04-11         NA         NA    5087355    2895616    3766771

【讨论】:

  • 这很棒。奇迹般有效。下次我会举个例子。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
相关资源
最近更新 更多