R data.table技术问询:如何使用列名向量按引用更新指定行
搞定data.table用列名向量更新特定行的问题
嗨,我懂你遇到的这个坑!你之前的写法不对,主要是没搞清楚data.table赋值时对“列值格式”的要求,咱一步步来解决:
问题根源
你用list(vec)的时候,相当于把整个向量当成了一个列的值,但你要更新的是多个列(cols里的a和b),每个列只需要对应vec里的一个元素,所以格式不匹配,自然跑不通。
正确实现方法
给你两种实用的写法,随便选哪种都能解决问题:
方法一:把向量转成列表(最通用)
这是最稳妥的方式,不管你要更新多少列都能用:
require(data.table) dt <- data.table(a=c(1,2), b=c(3,4)) cols <- colnames(dt) vec <- c(9,10) # 重点是用as.list()把vec拆成对应列的单个元素 dt[2, (cols) := as.list(vec)]
运行完你再看dt,第二行的a和b就变成9和10了:
> dt a b 1: 1 3 2: 9 10
方法二:直接解构向量(适合列数少的场景)
如果你的列数不多,也可以直接把vec里的元素逐个拿出来赋值:
dt[2, (cols) := .(vec[1], vec[2])]
效果和第一种完全一样,就是列多了的话写起来麻烦点。
补充:为啥..cols也没用?
你之前试的(..cols)是用来引用上层环境的列名向量,但这次的问题根本不是“找不到cols”,而是赋值的内容格式错了,所以就算加了..也白搭,核心还是要把vec转成能匹配多列的格式。
内容的提问来源于stack exchange,提问作者Roland
相关产品推荐
相关产品推荐

