按日期列合并或组合(对角线)数据框

时间:2016-03-02 23:05:16

标签: r

我有几个数据框如下所示。 123列是n以后的预测数量Date天。

Date           1     2     3
2016-02-02     100   NA    NA
2016-02-03     NA    55    NA
2016-02-04     NA    NA    75          

Date           1     2     3
2016-02-03     105   NA    NA
2016-02-04     NA    45    NA
2016-02-05     NA    NA    70

Date           1     2     3
2016-02-04     110   NA    NA
2016-02-05     NA    40    NA
2016-02-06     NA    NA    72

如何合并这些数据框,以便生成的DF看起来像这样?:

Date           1     2     3
2016-02-02     100   NA    NA
2016-02-03     105   55    NA
2016-02-04     110   45    75
2016-02-05     NA    40    70
2016-02-06     NA    NA    72

2 个答案:

答案 0 :(得分:2)

使用data.table,我们使用rbindlist,然后通过循环遍历列,将NAsna.omit一起省略,按照'日期'列。

library(data.table)
rbindlist(list(df1, df2, df3))[,lapply(.SD, na.omit), Date]
#          Date  X1 X2 X3
# 1: 2016-02-02 100 NA NA
# 2: 2016-02-03 105 55 NA
# 3: 2016-02-04 110 45 75
# 4: 2016-02-05  NA 40 70
# 5: 2016-02-06  NA NA 72

如果'日期'中存在重复的非NA元素在rbindlist步骤之后,我们可以对值进行平均值。

rbindlist(list(df1, df2, df3))[,lapply(.SD, mean, na.rm=TRUE), Date]

注:' df1',' df2',' df3' OP的帖子中显示了数据。

答案 1 :(得分:1)

使用dplyr和reshape2,我们可以将每个数据帧重新整形为长格式,删除NA,将它们堆叠在一起,而不是回到宽格式:

> list(df1,df2,df3) %>% lapply(melt, "Date", na.rm=TRUE) %>% rbind_all()  %>% dcast(Date~variable)
        Date  v1 v2 v3
1 2016-02-02 100 NA NA
2 2016-02-03 105 55 NA
3 2016-02-04 110 45 75
4 2016-02-05  NA 40 70
5 2016-02-06  NA NA 72