我有两个要合并的数据帧,如下所示:

df1 <- data.table(
  
  color = c("Green", "Green", "Red","Red"),
  year = c(1995, 2001,2010,1997)
)


df2 <- data.table(
  color = c("Green", "Green", "Red", "Blue"),
  value = 1:4,
  year = c(1996, 2002, 2001, 2003)
)

我想合并这些,以便保留df1中的所有观测值,但它们只与 colored颜色 组中具有最接近年值的df2中的观测值配对.I would ideally like to use 100 for this.

我试过这个:

df1 %>%
  inner_join(df2, by = 'color', suffix = c('.1', '.2')) %>%
  group_by(color) #%>%
  filter(abs(year.1 - year.2) == min(abs(year.1 - year.2)))

但是,这只给我留下了每种" colored颜色 "的一个观察结果,而不是df 1中的所有观察结果.如何合并以保持df 1中的所有观测值,并且仅按 colored颜色 和最接近的年份值合并?此外,是否有可能将其指定为之前/之后/之一的最近年份?

结果应该如下所示:

  df3 <- data.table(
  
  color = c("Green", "Green", "Red","Red"),
  year = c(1995, 2001,2010,1997),
  value = c(1,2,3,3)
)


推荐答案

对于"最近"的年份,我们可以这样做:

df1 %>%
  left_join(df2, join_by(color)) %>%
  arrange( year.x, abs(year.x - year.y)) %>%
  slice(1, .by = c(color, year.x))

#  color year.x value year.y
#1 Green   1995     1   1996
#2   Red   1997     3   2001
#3 Green   2001     2   2002
#4   Red   2010     3   2001

对于"之前/之后最近",我们可以这样做:

df1 %>%
  left_join(df2, join_by(color, closest(year >= year)))

#  color year.x value year.y
#1 Green   1995    NA     NA
#2 Green   2001     1   1996
#3   Red   2010     3   2001
#4   Red   1997    NA     NA

df1 %>%
  left_join(df2, join_by(color, closest(year <= year)))
    
#  color year.x value year.y
#1 Green   1995     1   1996
#2 Green   2001     2   2002
#3   Red   2010    NA     NA
#4   Red   1997     3   2001

R相关问答推荐

MCMC和零事件二元逻辑回归

如何对数据集进行逆向工程?

如何在xyplot中 for each 面板打印R^2

我想在R中总结一个巨大的数据框架,使我只需要唯一的lat、lon、Date(Year)和Maxium Value""""""""

在GGPLATE中将突出的点放在前面

`夹心::vcovCL`不等于`AER::tobit`标准错误

按组计算列中1出现的间隔年数

R中的类别比较

使用不同的定性属性定制主成分分析中点的 colored颜色 和形状

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

如何阻止围堵地理密度图?

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

在r中整理图例和堆叠图的问题

长/纬点继续在堪萨斯-SF结束,整齐的人口普查

R中的Desolve:返回的导数数错误

使用&Fill&Quot;在gglot中创建 colored颜色 渐变

把代码写成dplyr中的group_by/摘要更简洁吗?

如何在R中添加标识连续日期的新列

使用dplyr删除具有条件的行

如果y中存在x中的值,则将y行中的多个值复制到相应的x行中