R语言如何对字符串列应用函数生成对应0/1标记的新列?
问题原因分析
你现有代码的核心问题出在自定义的containsA函数:grepl本身是向量化函数,输入整列字符串时会返回和输入长度一致的布尔值向量,但你的判断逻辑只取了cond[1]也就是第一行的判断结果,导致整个新列所有行的值都和第一行的计算结果一致,自然得不到正确输出。
解决方案
方案1:直接向量化赋值(适合固定少量令牌)
不需要写自定义函数,直接用data.table的:=赋值语法配合向量化运算即可,布尔值转整数直接用as.integer()就行:
library(data.table) # 构造示例数据表 dt <- data.table(combind = c("A,B,C", "A", "A,B", "B,C")) # 直接生成对应列,as.integer会自动把TRUE转为1、FALSE转为0 dt[, A := as.integer(grepl("A", combind))] dt[, B := as.integer(grepl("B", combind))] dt[, C := as.integer(grepl("C", combind))]
如果存在更长的相似令牌(比如同时有A和AA这类值,避免误匹配),可以加单词边界限制:
dt[, A := as.integer(grepl("\\bA\\b", combind))]
方案2:批量自动生成所有令牌列(适合令牌数量多的场景)
如果令牌数量多,手动逐个写列效率太低,可以先提取所有唯一令牌,再批量生成对应列:
# 拆分所有combind值,提取唯一的令牌列表 all_tokens <- unique(unlist(strsplit(dt$combind, ","))) # 批量生成所有令牌对应的0/1列 dt[, (all_tokens) := lapply(all_tokens, function(x) as.integer(grepl(paste0("\\b",x,"\\b"), combind)))]
运行后得到的结果和你预期完全一致:
combind A B C 1: A,B,C 1 1 1 2: A 1 0 0 3: A,B 1 1 0 4: B,C 0 1 1
内容的提问来源于stack exchange,提问作者ArthwitRail
相关产品推荐
相关产品推荐

