如何解决根据最接近的日期将两个 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-22
和 fill
.direction = "down"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。