在 R 中合并两个数据帧,没有重复的条目

Posted

技术标签:

【中文标题】在 R 中合并两个数据帧,没有重复的条目【英文标题】:Combine two data frames in R without repeated entries 【发布时间】:2021-11-20 00:29:46 【问题描述】:

我有两个数据框,其中包含具有各自日期的行条目。数据框 1 包含从 2010 年到 2017 年收集的观察结果。

   dates       A
 2010-01-01   21
 2010-01-02   27
 2010-01-03   34
...
 2017-12-29   22
 2017-12-30   32
 2017-12-31   25

数据框 2 包含从 2015 年到 2020 年收集的观察结果。

  dates        A
 2015-01-01   20
 2015-01-02   29
 2015-01-03   34
...
 2020-12-29   22
 2020-12-30   27
 2020-12-31   32

这两个数据框都缺失了几天的观察结果。我希望结合两个数据框来填补缺失的数据,并获得到 2020 年的完整时间序列,而无需任何重复输入。像下面的数据框:

   dates       A
 2010-01-01   21
 2010-01-02   27
 2010-01-03   34
 ...
 2020-12-29   22
 2020-12-30   27
 2020-12-31   32

使用 merge(df1, df2, by = 'dates')full_join(df1, df2, by = 'dates') 会创建重复的条目或两列 A.xA.y,这不是预期的。

【问题讨论】:

如果日期出现在 df1df2 中会发生什么?你有sumA 价值观吗? 在这种情况下,我取两个值的平均值。或者,我也可以使用任何一个数据帧中的值。 【参考方案1】:

试试下面的代码

dfout <- unique(rbind(df1,df2))
dfout <- dfout[order(dfout$dates),]

【讨论】:

【参考方案2】:

如果在两个数据框mean 中都存在重复的日期A 值,则将df1df2 组合起来,并使用complete 来填充缺失的日期。

library(dplyr)
library(tidyr)

df1 %>%
  bind_rows(df2) %>%
  mutate(dates = as.Date(dates)) %>%
  group_by(dates) %>%
  summarise(A = mean(A)) %>%
  complete(dates = seq(min(date), max(date), by = 'day'))

【讨论】:

【参考方案3】:

如果您的df 真的只有两列,您应该可以通过bind_rowsgroup_bydistinct 删除重复项。

library(dplyr)
df <- bind_rows(df1, df2) %>%
   group_by(dates, A) %>%
   distinct(dates)

编辑:如果您的数据在单个日期的数据框之间不一致,这将不起作用。如果您有 2015 年 1 月 1 日的两条记录并且它们具有不同的 A 值,则它们都将被保留。

【讨论】:

以上是关于在 R 中合并两个数据帧,没有重复的条目的主要内容,如果未能解决你的问题,请参考以下文章

将没有唯一索引的数据帧与 Python 和 Pandas 合并 [重复]

在将其组合到R中的一个数据帧时,在不同的数据帧中保留重复的行名[重复]

Python合并两个具有不同日期时间的数据框[重复]

spark:合并两个数据帧,如果两个数据帧中的ID重复,则df1中的行覆盖df2中的行

合并一个值在另外两个之间的熊猫数据框[重复]

合并第二个数据帧中只有一个额外列的数据帧[重复]