在 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.x
和 A.y
,这不是预期的。
【问题讨论】:
如果日期出现在df1
和 df2
中会发生什么?你有sum
的A
价值观吗?
在这种情况下,我取两个值的平均值。或者,我也可以使用任何一个数据帧中的值。
【参考方案1】:
试试下面的代码
dfout <- unique(rbind(df1,df2))
dfout <- dfout[order(dfout$dates),]
【讨论】:
【参考方案2】:如果在两个数据框mean
中都存在重复的日期A
值,则将df1
和df2
组合起来,并使用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_rows
、group_by
和distinct
删除重复项。
library(dplyr)
df <- bind_rows(df1, df2) %>%
group_by(dates, A) %>%
distinct(dates)
编辑:如果您的数据在单个日期的数据框之间不一致,这将不起作用。如果您有 2015 年 1 月 1 日的两条记录并且它们具有不同的 A
值,则它们都将被保留。
【讨论】:
以上是关于在 R 中合并两个数据帧,没有重复的条目的主要内容,如果未能解决你的问题,请参考以下文章
将没有唯一索引的数据帧与 Python 和 Pandas 合并 [重复]
在将其组合到R中的一个数据帧时,在不同的数据帧中保留重复的行名[重复]