You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:36:03