R 如何将新摘要列的名称传递给函数中的data.table?

R 如何将新摘要列的名称传递给函数中的data.table?,r,data.table,R,Data.table,假设我想创建一个函数,从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 wh

假设我想创建一个函数,从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"
库(data.table)
#生成一些虚假数据
种子集(919)

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

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

groupMeans我们可以使用
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
groupMeans承蒙,您可以使用使用
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

groupMeans我会使用
dat[,setNames(list(mean(x)),out.var),by=by.var]
@docendodiscimus谢谢。这是我第一次尝试的。它给了我一个错误:
setnames(list(mean(x)),out.var中的错误:x不是data.table或data.frame
。不,我使用的是base R中的
setnames
,而不是data.tableAha中的
setnames
!真管用!看起来我很粗心,错误地使用了
setnames
。谢谢你已经尝试了几乎正确的方法,或者,
structure(.(mean(x)),.Names=out.var)
。。。但这更具可读性