如何将df1的Score匹配到df2的Score区间并返回对应Category?
解决方案
给你几个靠谱的实用方案,都是日常处理这类区间匹配问题常用的:
方法1:dplyr逐行匹配(小数据量首选,直观易懂)
通过rowwise()逐行处理df1的每个Score值,从df2中筛选出符合区间条件的Category:
library(dplyr) final.df <- df1 %>% rowwise() %>% mutate(Category = df2$Category[Score >= df2$Score_min & Score <= df2$Score_max]) %>% ungroup() # 验证是否符合预期结果 all.equal(final.df$Category, c(70, 50, 10, 90, 30, 60, 70, 80, 60, 20))
方法2:base R的cut函数(高效简洁,适配规则区间)
由于df2的区间是连续无重叠的,直接用cut()函数把Score映射到对应Category:
# 提取区间断点和对应标签 breaks <- c(df2$Score_min, max(df2$Score_max) + 1) labels <- df2$Category final.df <- df1 %>% mutate(Category = as.numeric(as.character(cut(Score, breaks = breaks, labels = labels, include.lowest = TRUE)))) # 验证结果 all.equal(final.df$Category, c(70, 50, 10, 90, 30, 60, 70, 80, 60, 20))
方法3:data.table非等连接(大数据量必备,性能拉满)
如果数据量很大,用data.table的非等连接效率会远超前两种方法:
library(data.table) setDT(df1) setDT(df2) final.df <- df1[df2, on = .(Score >= Score_min, Score <= Score_max), Category := i.Category] # 可选:转回data.frame格式 final.df <- as.data.frame(final.df) # 验证结果 all.equal(final.df$Category, c(70, 50, 10, 90, 30, 60, 70, 80, 60, 20))
内容的提问来源于stack exchange,提问作者Sarah Medoff
相关产品推荐
相关产品推荐

