【问题标题】:pass variables and names to data.table function将变量和名称传递给 data.table 函数
【发布时间】:2014-08-13 05:04:12
【问题描述】:

我有一份报告需要应用于不同名称的 data.tables [j 和 by]。 我通过将参数包装在eval(substitute(value)) 函数中来完成它的唯一方法。这会降低代码的可读性。 我已将 j 参数命名为“变量”,但我想将函数的 j 参数传递给 setnames 函数。

所以,问题是:

有没有办法避免eval(substitute(value)) 构造?

我可以将 j 参数传递给 setnames 函数吗?

library(data.table)
library(ggplot2)
data(diamonds, package = "ggplot2")
dt = as.data.table(diamonds)

var.report = function(df, value, by.value) {
  var.report = df[, list( .N,
                    sum(is.finite(eval(substitute(value)))), # count values
                    sum(is.na(eval(substitute(value)))) # count NA
  ), by = eval(substitute(by.value))]

  setnames(var.report, c("variable", "N","n.val","n.NA"))

  return(var.report)
}


var.report(dt, depth, clarity)

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    eval(substitute'ing 整个函数体怎么样(或者如果你想更具体一点,只需 data.table 计算):

    var.report = function(df, value, by.value) {
      eval(substitute({
        var.report = df[, list( .N,
                          sum(is.finite(value)), # count values
                          sum(is.na(value)) # count NA
        ), by = by.value]
    
        setnames(var.report, c("variable", "N","n.val","n.NA"))
    
        return(var.report)
      }))
    }
    
    var.report(dt, depth, clarity)
    #   variable     N n.val n.NA
    #1:      SI2  9194  9194    0
    #2:      SI1 13065 13065    0
    #3:      VS1  8171  8171    0
    #4:      VS2 12258 12258    0
    #5:     VVS2  5066  5066    0
    #6:     VVS1  3655  3655    0
    #7:       I1   741   741    0
    #8:       IF  1790  1790    0
    

    我不太明白第二个问题,我通常会在原始表达式中指定名称,这有助于更好地跟踪事物,如下所示:

    var.report = df[, list(N     = .N,
                           n.val = sum(is.finite(value)), # count values
                           n.NA  = sum(is.na(value)) # count NA
                          )
                    , by = list(variable = by.value)]
    

    【讨论】:

    • 谢谢!这行得通。关于第二个问题:“by.value”在最终结果中称为“变量”。我希望已经命名,因为我在函数调用中明确说明了该变量的名称。现在我必须添加一个手动 setnames(df, "variable", "by.value")。
    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多