如何按最近时间关联两个R DataFrame并满足指定列填充规则
解决方案
要实现将df2的每个时间匹配到df1中最接近的时间,并保留df2所有时间、统一设置validated为"coral_sol"、N为NA,可以用以下两种方法:
方法一:使用dplyr + fuzzyjoin包
这种方法代码可读性高,适合熟悉tidyverse的用户:
# 加载所需包 library(dplyr) library(fuzzyjoin) # 取消df1的分组(原df1是分组数据框,需转为普通数据框) df1_ungrouped <- df1 %>% ungroup() # 按最接近的时间关联,保留df2所有行,设置指定列值 result <- df2 %>% # 匹配df2和df1中最接近的cycle时间 closest_join(df1_ungrouped, by = "cycle", max_dist = Inf) %>% # 统一设置validated和N列 mutate(validated = "coral_sol", N = NA_integer_) %>% # 整理列:保留df2的cycle,以及设置后的validated和N select(validated, cycle = cycle.x, N) # 查看结果 head(result)
方法二:使用data.table包
这种方法处理大数据集时效率更高:
# 加载data.table包 library(data.table) # 将df1和df2转换为data.table格式 setDT(df1) setDT(df2) # 取消df1的分组 df1 <- df1[, .SD, by = NULL] # 滚动匹配最接近的时间,并设置指定列值 result <- df2[df1, on = .(cycle), roll = "nearest", .(cycle = x.cycle, validated = "coral_sol", N = NA_integer_)] # 查看结果 head(result)
说明
- 两种方法都会保留df2的全部40条时间记录
validated列所有值都会被设置为"coral_sol"N列所有值都会被设置为整数类型的NA(NA_integer_),与原df1的N列类型保持一致- 如果需要保留每个df2时间匹配到的df1对应时间,可以在
select或结果构造中添加matched_cycle = cycle.y(dplyr方法)或matched_cycle = i.cycle(data.table方法)
内容的提问来源于stack exchange,提问作者Wilson Souza
相关产品推荐
相关产品推荐

