在R中实现类似Excel VLOOKUP的取最大值关联匹配功能
在R中实现匹配Item并返回Max1最大值及对应字段的功能
需求:基于Book3的Item列表,从Book4中提取每个Item对应的Max1最大值所在行的全部字段(包括Additional1、Additional2),实现类似Excel带条件的VLOOKUP效果。
示例数据
先构造可测试的示例数据框:
# 目标Item列表 Book3 <- data.frame(Item = c("A", "B", "C")) # 包含明细数据的数据集 Book4 <- data.frame( Item = c("A", "A", "B", "B", "C"), Max1 = c(10, 20, 5, 15, 25), Additional1 = c("X1", "X2", "Y1", "Y2", "Z1"), Additional2 = c("P1", "P2", "Q1", "Q2", "R1") )
方法一:使用dplyr包(推荐,代码简洁易读)
dplyr的分组和筛选函数可以快速实现需求:
library(dplyr) # 1. 从Book4中提取每个Item的Max1最大值对应行 max_rows <- Book4 %>% group_by(Item) %>% slice_max(order_by = Max1, n = 1) %>% # 取每组Max1最大的1行 ungroup() # 2. 与Book3做左连接,确保保留所有目标Item result <- Book3 %>% left_join(max_rows, by = "Item")
- 若某个Item存在多个相同的Max1最大值,
slice_max默认会返回所有符合条件的行;如需仅返回其中一行,添加参数with_ties = FALSE即可。 left_join保证Book3中的所有Item都被保留,若Book4中无对应Item,对应字段会显示NA。
方法二:使用Base R(无需额外安装包)
如果不想加载第三方包,可用Base R实现:
# 1. 计算每个Item的Max1最大值 max_vals <- tapply(Book4$Max1, Book4$Item, max) # 2. 筛选出Book4中Max1等于对应Item最大值的行 max_rows_base <- Book4[Book4$Max1 == max_vals[Book4$Item], ] # 3. 合并到Book3,保留所有目标Item result_base <- merge(Book3, max_rows_base, by = "Item", all.x = TRUE)
内容的提问来源于stack exchange,提问作者user20203146
相关产品推荐
相关产品推荐

