在R中的另一个函数中使用data.table

Caranbot

当创建带有列的新变量时,data.table不允许带引号的列名。在函数中使用data.table时,将产生以下问题。

library(data.table) 
dt <- data.table(var1 = c(1:10), var2 = seq(2,20,2), var3 = seq(40,4,-4))    

addColumnsError <- function(dt, v1, v2){
  dt[,v1 + v2]
}

addColumnsError(dt, var1, var2)
>  Error in eval(jsub, SDenv, parent.frame()) : object 'var1' not found 

addColumnsError(dt, "var1", "var2")
>   Error in v1 + v2 : non-numeric argument to binary operator

以下变通办法解决了此问题。

addColumns <- function(dt,v1,v2){

  v1<-as.character(substitute(v1))
  v2<-as.character(substitute(v2))

  dt[,eval(parse(text=v1)) + eval(parse(text=v2))]
}

addColumns(dt, var1, var2)
[1]  3  6  9 12 15 18 21 24 27 30
addColumns(dt, "var1", "var2")
[1]  3  6  9 12 15 18 21 24 27 30

有没有更优雅的方法将列名传递给函数中的data.table对象?

(注意:我可以只调用data.table函数,但我打算进行更复杂的计算:))

罗兰

如果要使用非标准评估,则需要类似的内容substitute但是,绝对没有理由使用parse

addColumnsError <- function(dt, v1, v2){
  eval(substitute(dt[, v1 + v2]))
}

addColumnsError(dt, var1, var2)
#[1]  3  6  9 12 15 18 21 24 27 30

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

R data.table添加列作为另一个data.table的函数

使用 R 从另一个 data.table 中使用条件查找将新列添加到 data.table

使用 R 的 Table 函数交叉制表按另一个变量分组的数据

R:根据另一个data.table中的条件“标记”一行

在另一个字段上使用 RegEx 在 R data.table 中创建新字段

如何按列将R中的一个data.table除以另一个?

如何从另一个data.table重命名R data.table中的级别?

R:尝试使用另一个data.table对列进行操作时,data.table中的行为异常

使用一组按总和计算的当前值,使用 data.table 计算 R 中的另一个值

根据另一个data.table删除data.table中的行

在data.table中:遍历另一个data.table的行

从另一个 data.table 替换一个 data.table 中的值

根据另一个data.table中的值填充一个data.table

如何在R data.table中的列表列上执行操作以输出另一个列表列?

在另一个变量的情况下,用R data.table替换多列中的值

根据 data.table 中的另一个行值替换行值

无法按时执行滚动连接以及data.table中的另一个变量

将结果独家保存在另一个data.table中

根据先前的值和data.table中的另一个变量填充变量

使用另一个data.table的引用创建新变量

使用从另一个data.table的变量动态创建的i语句的子集

用另一个data.table中的值替换data.table中的值

使用来自另一个 data.table 列的值更新 data.table 列中的值子集

在直接调用mget()与在另一个函数中调用mget()时,为什么data.table j具有不同的环境?

神秘:如果我添加和减去另一个变量,为什么data.table中的as.character()函数运行得更快?

确切了解data.table是何时引用另一个data.table(相对于另一个data.table的副本)

根据另一个data.table值递增data.table值

根据与另一个 data.table 的匹配更新 data.table 列

根据另一个data.table的行提取data.table的行