如何使用dplyr的group_by/mutate实现多组内最近值匹配生成结果列
使用dplyr实现同id下最接近值匹配
前置准备
首先构造你提供的两份示例数据,代码如下:
library(dplyr) # 数据1 df1 <- tibble( id1 = c(1,1,1,1,2,2,3,4), value1 = c(98, 101, 118, 170, 95, 201, 160, 70) ) # 数据2 df2 <- tibble( id2 = c(1,1,2,2,3), value2 = c(100, 120, 105, 200, 300) )
实现代码
仅使用dplyr自带函数即可完成需求,逻辑如下:
result <- df1 %>% # 按id左连接两份数据,同id的df1行会匹配到所有同id的df2的value2 left_join(df2, by = c("id1" = "id2")) %>% # 按df1的id1和value1分组,保证每个原始df1的行独立成组 group_by(id1, value1) %>% # 每组内计算差的绝对值,取差最小的value2,无匹配时返回NA summarise( value2 = ifelse(all(is.na(value2)), NA_real_, value2[which.min(abs(value1 - value2))]), .groups = "drop" # 统计完成后自动取消分组 )
如果存在两个value2和value1差值完全相等的情况,上述代码会默认取排序在前的value2,你可以根据需求调整取值规则。
内容的提问来源于stack exchange,提问作者Memento_mori
相关产品推荐
相关产品推荐

