【问题标题】:Use data.table within another function in R在 R 中的另一个函数中使用 data.table
【发布时间】:2019-01-30 13:48:08
【问题描述】:

使用列创建新变量时,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 函数,但我打算进行更复杂的计算:))

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    如果你想使用非标准评估,你需要像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
    

    【讨论】:

      【解决方案2】:

      我认为您正在寻找 get()!

      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[,get(v1) + get(v2)]
      }
      
      addColumnsError(dt, "var1", "var2")
      

      最好的!

      【讨论】:

        【解决方案3】:

        使用.SDcols(接受字符)你可以这样做:

        addColumns <- function(dt, v1, v2){
          dt[, .SD[[1]] + .SD[[2]], .SDcols = c(v1, v2)]
        }
        
        # or more elegantly:
        addColumns <- function(dt, v1, v2){
          dt[, rowSums(.SD), .SDcols = c(v1, v2)]
        }
        
        addColumns(dt, "var1", "var2")
        # [1]  3  6  9 12 15 18 21 24 27 30
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多