如何通过函数参数定义R中data.table/data.frame的列名?
如何在R的data.table函数中动态指定新列名?
这个问题在data.table的函数编写中很常见——当你想通过参数动态生成列名时,直接用变量名会被当成字面量列名,而不是你传入的目标字符串。我来帮你解决这个问题:
问题根源
你原来的代码:
renamer = function(colname, dt){ dt[, colname:= 42] }
这里的colname会被data.table当作字面量列名,而不是变量里存储的字符串(比如你传入的'foo'),所以最终新增的列叫colname而不是'foo'。
解决方案1:用括号包裹变量解析列名
data.table支持用括号()来解析变量中的字符串作为列名,修改你的函数如下:
renamer = function(colname, dt){ dt[, (colname) := 42] }
调用renamer('foo', dt)后,dt就会新增名为foo的列,值全为42。
解决方案2:用set()函数(更高效)
如果你处理的是大数据集,推荐用data.table的set()函数,它避免了[.data.table的一些语法开销,写法更直接:
renamer = function(colname, dt){ set(dt, j = colname, value = 42) }
这个方法同样能动态指定列名,效果和第一种完全一致。
针对你的DT示例的完整实现
按照你的需求,编写colnamer函数:
library(data.table) DT = data.table(ID = c("b","b","b","a","a","c"), a = 1:6, b = 7:12, c = 13:18) colnamer = function(colname, dt){ # 用括号解析变量作为列名 dt[, (colname) := 42] } # 调用函数 colnamer('foobar', DT)
执行后DT的结果:
> DT ID a b c foobar 1: b 1 7 13 42 2: b 2 8 14 42 3: b 3 9 15 42 4: a 4 10 16 42 5: a 5 11 17 42 6: c 6 12 18 42
补充:data.frame的动态列名处理
如果你同时需要处理data.frame,注意$符号无法解析变量,要改用[[运算符:
colnamer_df = function(colname, df){ df[[colname]] = 42 return(df) # data.frame是值传递,需要返回修改后的对象 }
内容的提问来源于stack exchange,提问作者ShanZhengYang
相关产品推荐
相关产品推荐

