【问题标题】:Join multiple data frames based on date根据日期加入多个数据框
【发布时间】:2017-11-12 11:30:41
【问题描述】:

我想加入基于Time 的所有三个文件。如果数据框没有该特定日期的值,我想添加 NA。总共应该有 7 列的输出。

> head(Dax1,3)
        Time      Res     Accum
1 2017-10-20  1174.60 172278.21
2 2017-10-18  -109.41 171103.61
3 2017-08-28 -2670.84 171213.02
> head(Dax2,3)
        Time     Res     Accum
1 2017-10-23 1473.25 185076.53
2 2017-08-24 1001.50 183603.28
3 2017-07-31 -144.96 182601.79
> head(Dax3,3)
        Time     Res      Accum
1 2017-11-07 -348.37 189 023.90
2 2017-10-26  398.16 189 372.27
3 2017-10-25  -80.19 188 974.10

我尝试了join_all,但它似乎以长格式连接它们。我希望它们并排共 7 列:

> join_all(list, by = "Time",match = "all",type="full")
        Time      Res      Accum
1 2017-10-20  1174.60  172278.21
2 2017-10-18  -109.41  171103.61
3 2017-08-28 -2670.84  171213.02
4 2017-10-23  1473.25  185076.53
5 2017-08-24  1001.50  183603.28
6 2017-07-31  -144.96  182601.79
7 2017-11-07  -348.37 189 023.90
8 2017-10-26   398.16 189 372.27
9 2017-10-25   -80.19 188 974.10

【问题讨论】:

  • rbind(Dax1, Dax2, Dax3) 事后你可能会想办法
  • @G5W Probaby cbind 你的意思是?
  • cbind 创建 3 个输出行。输入中有更多唯一日期。
  • 尝试创建唯一的列名,即plyr::join_all(Map(function(x,y) {names(x)[-1] <- paste0(names(x)[-1], y); x}, lst, seq_along(lst)), by = "Time",match = "all",type="full")
  • @akrun 你是对的。我误读了这个问题。但是 cbind 也不起作用。

标签: r dataframe


【解决方案1】:

我们可以重命名list 中除“时间”列之外的数据集列并应用join_all

res1 <- plyr::join_all(Map(function(x,y) {
         names(x)[-1] <- paste0(names(x)[-1], y)
         x}, lst, seq_along(lst)), by = "Time",match = "all",type="full")

或者这可以使用tidyverse中的一些函数在一个链中完成

library(purrr)
library(dplyr)
res2 <- lst %>%
          map2(., seq_along(.), ~setNames(.x, c('Time', paste0(names(.x)[-1], .y)))) %>% 
          plyr::join_all(., by = 'Time', match = 'all', type = 'full')

identical(res1, res2)
#[1] TRUE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多