R data.table列值更新问题:如何为每行C列提取唯一值
解决方案
你的问题出在没有对每行单独处理,当前代码会把所有行的C列内容合并后再取唯一值,导致全局统一结果。以下是两种可行的data.table风格解决方法:
方法1:按行分组处理(by=.I)
# 直接修改原表的C列 mytable[, C := paste(unique(strsplit(C, ", ")[[1]]), collapse = ", "), by = .I] # 或者生成新表 new_table <- mytable[, .(A, B, C = paste(unique(strsplit(C, ", ")[[1]]), collapse = ", ")), by = .I][, -"V1"]
by=.I表示按每一行作为一个分组,这样每行的C列会被单独拆分、去重、合并。
方法2:用sapply遍历每行数据
mytable[, C := sapply(strsplit(C, ", "), function(x) paste(unique(x), collapse = ", "))]
strsplit(C, ", ")会返回一个列表,每个元素对应一行拆分后的向量;sapply遍历这个列表,对每个行的向量去重后再合并成字符串。
注意事项
如果你的C列中逗号后可能存在不定数量的空格(比如有的是", "有的是","),可以先清理空格再拆分:
mytable[, C := sapply(strsplit(trimws(gsub(",\\s+", ",", C)), ","), function(x) paste(unique(x), collapse = ", "))]
这段代码先把所有逗号后的多空格替换成单个逗号,再去除首尾空格,最后拆分去重。
内容的提问来源于stack exchange,提问作者harish
相关产品推荐
相关产品推荐

