data.table链式操作无法创建新变量:示例失效原因求助
解决data.table链式操作与赋值的问题
我来帮你拆解代码里的几个关键问题,一步步修正后就能得到你想要的结果啦:
1. v4无法提取完整数字的原因
你写的正则表达式"\\D*(\\d)"只会匹配第一个单个数字,对于nr.10这类带多位数的内容,它会只捕获1而忽略后面的0,导致结果不符合预期。要提取所有连续数字,需要把正则改成"\\D*(\\d+)",其中+表示匹配一个或多个连续数字,这样就能完整提取数字部分了。
2. 链式操作无法修改原表的问题
当你写dt[a=="by"][ , v5:=...]时,dt[a=="by"]返回的是原表的子集副本,后续的:=操作都只作用在这个副本上,不会影响原表dt。要在原表的指定子集上完成赋值,不需要拆分链式,直接在同一个[]里指定行条件即可。
修正后的完整代码
library(data.table) # 创建数据时给第二列命名(可选,但更清晰) dt <- data.table(a=c(rep("komm", 5), rep("by", 5)), V2=paste0("nr.",1:10)) # 给komm组赋值v3 dt[a=="komm", v3:=sub("nr.", "", V2)] # 修正正则,提取所有数字到v4 dt[, v4:=sub("\\D*(\\d+)", "\\1", V2)] # 在原表的by组上批量赋值v5和v6 dt[a=="by", `:=`( v5=sub("nr.", "no.", V2), v6=sub("\\D*(\\d+)", "\\1", V2) )] # 查看最终结果 dt
验证结果
运行上面的代码后,输出完全符合你的预期:
a V2 v3 v4 v5 v6 1: komm nr.1 1 1 <NA> 1 2: komm nr.2 2 2 <NA> 2 3: komm nr.3 3 3 <NA> 3 4: komm nr.4 4 4 <NA> 4 5: komm nr.5 5 5 <NA> 5 6: by nr.6 <NA> 6 no.6 6 7: by nr.7 <NA> 7 no.7 7 8: by nr.8 <NA> 8 no.8 8 9: by nr.9 <NA> 9 no.9 9 10: by nr.10 <NA> 10 no.10 10
小补充:如果一定要用链式操作修改原表,可以写成dt[a=="by"][, :=(v5=..., v6=...)][dt],但这种写法不如直接在原表指定条件赋值高效易读,更推荐上面的写法。
内容的提问来源于stack exchange,提问作者yuskam
相关产品推荐
相关产品推荐

