根据最接近的日期将两个 dfs 分组

问题描述

这些是两个数据帧的子集。

df1:

绘图 mean_first_flower_date gdd
1 2019-07-15 60
1 2019-07-21 50
1 2019-07-23 78
2 2019-05-13 100
2 2019-05-22 173
2 2019-05-25 245

(续)

df2:

绘图 日期 鲜花
1 2019-07-12 2
1 2019-07-13 9
1 2019-07-14 3
1 2019-07-15 3
2 2019-05-12 10
2 2019-05-13 10
2 2019-05-14 14
2 2019-05-15 17

(续)

df2 与 df1 有一些匹配的日期,但有时这些日期会关闭一天或几天(以粗体突出显示)。

我想根据“日期”和“情节”对两个 dfs 进行分组,保留 df2,而不会丢失来自 df1 的“gdd”数据。

例如,如果由于日期不匹配,我将两个 dfs 内部_join,就会发生这种情况。

因此,如果 df1 中的日期比 df2 中可能匹配的日期早或晚一到三天,这很好,因为日期相对接近。这很棘手,因为只有当 df1 中没有该数据范围的可用数据时,我才希望进行此数据替换。

我的目标是拥有这样的东西:

绘图 日期 鲜花 gdd
1 2019-07-12 2 60
1 2019-07-13 9 60
1 2019-07-14 3 60
1 2019-07-15 3 60
2 2019-05-12 10 100
2 2019-05-13 10 100
2 2019-05-14 14 100
2 2019-05-15 17 100

可以吗?

我非常感谢任何帮助! 谢谢!

解决方法

我认为 data.table 包中的“滚动连接”可以解决这个问题:

library(data.table)
setDT(df1)
setDT(df2)

df1[,mean_first_flower_date := as.Date(mean_first_flower_date)]
df2[,date := as.Date(date)]

df1[df2,on=c("plot","mean_first_flower_date==date"),roll=3,rollends=TRUE]

#   plot mean_first_flower_date gdd flowers
#1:    1             2019-07-12  60       2
#2:    1             2019-07-13  60       9
#3:    1             2019-07-14  60       3
#4:    1             2019-07-15  60       3
#5:    2             2019-05-12 100      10
#6:    2             2019-05-13 100      10
#7:    2             2019-05-14 100      14
#8:    2             2019-05-15 100      17

使用这些数据:

df1 <- read.table(text="plot  mean_first_flower_date  gdd
1  2019-07-15  60
1  2019-07-21  50
1  2019-07-23  78
2  2019-05-13  100
2  2019-05-22  173
2  2019-05-25  245",header=TRUE)

df2 <- read.table(text="plot  date  flowers
1  2019-07-12  2
1  2019-07-13  9
1  2019-07-14  3
1  2019-07-15  3
2  2019-05-12  10
2  2019-05-13  10
2  2019-05-14  14
2  2019-05-15  17",header=TRUE)
,

fill 尝试 dplyr。使用这种语法

df2 %>% left_join(df1,by = c("plot" = "plot","date" = "mean_first_flower_date")) %>%
  fill(gdd,.direction = "up")

  plot       date flowers gdd
1    1 2019-07-12       2  60
2    1 2019-07-13       9  60
3    1 2019-07-14       3  60
4    1 2019-07-15       3  60
5    2 2019-05-12      10 100
6    2 2019-05-13      10 100
7    2 2019-05-14      14  NA
8    2 2019-05-15      17  NA

如您所见,最后两行中有两个 NA,如果您加入实际的 df2,这些行将被 {{1} } 因为将匹配 173。如果你想填充最后的 NA 行,如果有的话,你可以再次使用 2019-05-22fill

.direction = "down"

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...