【问题标题】:Merging dataframes of different length by matching dates通过匹配日期合并不同长度的数据框
【发布时间】:2017-04-17 20:25:39
【问题描述】:

我有两个不同长度的数据框(n=3012 和 3008),我需要根据日期进行合并。我曾尝试使用 merge 和 rbindfill 函数,但没有成功。两个数据帧之间的共同点是 date_time,但是两个 df2 的值都与 df1 不同。

df1

ID date_time Q_cfs Data_Code
68 2016-11-01 00:00:00   353         P
69 2016-11-01 00:15:00   356         P
70 2016-11-01 00:30:00   357         P
71 2016-11-01 00:45:00   356         P
72 2016-11-01 01:00:00   358         P
73 2016-11-01 01:15:00   355         P

df2

ID  stage           date_time
1  4.82 2016-11-01 00:00:00
2  4.83 2016-11-01 00:15:00
3  4.84 2016-11-01 00:30:00
4  4.85 2016-11-01 00:45:00
5  4.86 2016-11-01 01:00:00
6  4.87 2016-11-01 01:15:00

我尝试使用合并(如下),但由于列长度不同,它不起作用。

DF_New<- merge(df1,df2, by.x = df1$date_time, by.y = df2$date_time)

我也尝试使用 rbind.fill(如下),但它用 .

替换了 df2 的所有值
DF_New <- rbind.fill(df1,df2)

有什么建议吗?

【问题讨论】:

  • 您对失败原因的假设不正确。与不等行数的数据帧合并是典型的。如果您需要强制转换为 Date-class,请使用 as.Date

标签: r merge time-series rbind


【解决方案1】:

使用dplyr 包并尝试left_join()。这将返回来自df1 的所有行以及来自df1df2 的所有列。 df1 中任何不匹配的行都将收到 NA

library(dplyr)
left_join(df1, df2, by = "date_time")

查看?join 可以加入的其他类型。

【讨论】:

    【解决方案2】:

    你说得几乎是正确的。您需要做的就是在函数中再添加一个参数,如下例所示:

    DF_New<- merge(df1,df2, by.x = df1$date_time, by.y = df2$date_time, all=TRUE)
    

    【讨论】:

    • 我仍然收到以下错误。 fix.by(by.x, x) 中的错误:“by”必须匹配列数
    • 那就试试吧:by"date_time
    • DF_New
    • 那就试试吧:DF_New
    • 数据框现在正在合并,但它们不匹配基于 date_time 戳。两个数据帧都设置为相同的时区,但时间有 7 小时的偏移。有什么建议吗?
    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 2021-05-27
    • 2020-08-03
    • 2019-03-09
    • 1970-01-01
    • 2019-05-23
    • 2023-03-06
    相关资源
    最近更新 更多