【问题标题】:How do I pass names for new summary columns to data.table in a function?如何将新汇总列的名称传递给函数中的 data.table?
【发布时间】:2016-02-11 18:35:33
【问题描述】:

假设我想创建一个从 R 中的 data.table 计算摘要数据集的函数,并且我希望能够以编程方式传递新计算变量的名称。

例如:

library(data.table)

# generate some fake data
set.seed(919)
dt <- data.table(x = rnorm(50), by.var = rep(c("a", "b"), 25))
dt[, list(group.means = mean(x)), by = "by.var"]  # This is what I want

# But I want to do in a function, so I can do it repeatedly:
groupMeans <- function(out.var, by.var, dat = dt) {
  return(dat[, list(out.var = mean(x)), by = by.var])  # doesn't work
}

groupMeans("group.means", "by.var")  # out.var should be "group.means"

我该怎么做?

【问题讨论】:

  • 我会使用dat[, setNames(list(mean(x)), out.var), by = by.var]
  • @docendodiscimus 谢谢。这就是我首先尝试的。它给了我错误:Error in setnames(list(mean(x)), out.var) : x is not a data.table or data.frame.
  • 不,我使用的是来自 base R 的 setNames,而不是来自 data.table 的 setnames
  • 啊哈!这样可行!看起来我很粗心,错误地使用了setnames。谢谢!
  • 自己回答吧——你已经尝试了几乎正确的方法

标签: r data.table


【解决方案1】:

感谢docendo discimus,您可以使用setNames 创建的命名列表,如下所示:

groupMeans <- function(out.var, by.var, dat = dt) {
  return(dat[, setNames(list(mean(x)), out.var), by = by.var])  
}

groupMeans("group.means", "by.var")
#    by.var group.means
# 1:      a  -0.1159832
# 2:      b   0.2910531

【讨论】:

  • 或者,structure(.(mean(x)), .Names = out.var)... 但这更具可读性
【解决方案2】:

您可以考虑更改函数内的列名:

groupMeans <- function(out.var, by.var, dat = dt) {
  res <- dat[, list(mean(x)), by=by.var]
  setnames(res, "V1", out.var)
  res
}

【讨论】:

    【解决方案3】:

    我们可以使用setnames 来命名带有“out.var”向量的汇总列。

    groupMeans <- function(out.var, by.var, dat = dt) {
      setnames(dat[, list(mean(x)), by = by.var], 
                     length(by.var)+1L, out.var)
    }
    
    groupMeans("group.var","by.var", dt)[]
    #    by.var  group.var
    #1:      a -0.1159832
    #2:      b  0.2910531
    

    编辑:基于@Frank 的建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-19
      • 2014-08-13
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 2011-04-02
      相关资源
      最近更新 更多