R实现替代Excel VLOOKUP+HLOOKUP的双维度数据匹配合并
R实现按id+列序号双维度匹配的数据合并
你需要的匹配逻辑(先按id对齐行,再根据v的数值取对应v1~vN列的值)在R中可以用非常简洁的代码实现,天然适配v到v50甚至更多列的场景,不需要手动枚举列名,以下是两种常用方案:
方案1:tidyverse长表连接(推荐,容错性最好)
该方案按列名匹配,不受输入表列顺序影响,后续v列数量增减不需要修改代码:
library(tidyverse) # 将宽格式的inputs转换为长表,生成和df一致的id、v匹配键 inputs_long <- inputs %>% pivot_longer( cols = starts_with("v"), # 自动选中所有v开头的指标列 names_to = "v", values_to = "key", names_prefix = "v", # 去除列名前缀"v",仅保留数字 names_transform = list(v = as.integer) # 把v转为整数类型,和df中的v字段类型匹配 ) # 直接按id、v双字段做内连接,得到最终结果 result <- df %>% inner_join(inputs_long, by = c("id", "v"))
运行后输出的result和你给出的示例结果完全一致。
方案2:基础R矩阵索引(性能最优,适合大数据量)
无需加载第三方包,利用R原生的矩阵索引能力直接取值,十万级以上数据量运行速度极快:
# 匹配df每条记录对应inputs的行位置 row_loc <- match(df$id, inputs$id) # 计算对应列位置:inputs首列为id,v1对应第2列,因此列位置为v值+1 col_loc <- df$v + 1 # 批量索引取值,直接赋值得到key列 df$key <- inputs[cbind(row_loc, col_loc)]
注意事项
- 如果df中存在inputs没有的id,或者v值超出inputs中v列的最大序号,两种方案都会返回NA,和Excel查找匹配失败的逻辑一致
- 方案2依赖inputs的列顺序:必须保证id列之后连续排列v1、v2……vN列,如果列顺序不固定优先选方案1
内容的提问来源于stack exchange,提问作者EGM8686
相关产品推荐
相关产品推荐

