如何基于列表精确匹配为data.table添加列?
实现data.table中varB与命名列表的精确匹配
原始数据
library(data.table) dat <- fread("varA, varB some_string a1 other_string a3 blabla a3_2") renaming_list <- c( some_name = "a1", other_name = "a3")
需求
将varB与renaming_list进行精确匹配,匹配成功则替换为列表对应的名称,无匹配项则设为NA,最终得到如下结果:
dat <- fread("varA, varB, name some_string a1 some_name other_string a3 other_name blabla a3_2 NA")
原非精确匹配代码
此前使用的模糊匹配代码:
dat[, panel_name:=apply(outer(renaming_list, varB, Vectorize(grepl)), 2, \(x) if (any(x)) names(which(x)) else NA)]
精确匹配调整方案
方案1:修改原有代码实现精确匹配
将原代码中的grepl(模糊匹配)替换为精确相等的==即可,无需额外修改逻辑:
dat[, name := apply(outer(renaming_list, varB, `==`), 2, \(x) { if (any(x)) names(which(x)) else NA_character_ })]
方案2:使用data.table高效join(推荐)
更符合data.table风格且效率更高的方式是构建映射表后执行关联匹配:
# 将命名列表转为映射data.table rename_map <- data.table(varB = unname(renaming_list), name = names(renaming_list)) # 左关联匹配,自动填充匹配结果,无匹配则为NA dat[rename_map, on = .(varB), name := i.name]
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

