在data.table中使用带有.SD和.SDcols的mean

Mar*_*ese 5 r mean data.table

我正在编写一个非常简单的函数来汇总data.tables列.我一次将一列传递给函数,然后进行一些诊断以找出汇总选项,然后进行汇总.我在data.table中这样做,以允许一些非常大的数据集.

所以,我.SDcols用来传递列总结,并.SDjdata.table表达式的部分使用函数.由于我一次只传递一列,所以我没有使用lapply.而我发现的是,有些功能有效,有些则无效.下面是我正在使用的测试数据集以及我看到的结果:

dt <- data.table(
  a=1:10, 
  b=as.factor(letters[1:10]), 
  c=c(TRUE, FALSE), 
  d=runif(10, 0.5, 100), 
  e=c(0,1), 
  f=as.integer(c(0,1)), 
  g=as.numeric(1:10), 
  h=c("cat1", "cat2", "cat3", "cat4", "cat5"))

mean(dt$a)
[1] 5.5

dt[, mean(.SD), .SDcols = "a"]

[1] NA
Warning message:
In mean.default(.SD) : argument is not numeric or logical: returning NA

dt[, sum(.SD), .SDcols = "a"]
[1] 55

dt[, max(.SD), .SDcols = "a"]
[1] 10

dt[, colMeans(.SD), .SDcols = "a"]
  a 
5.5 

dt[, lapply(.SD, mean), .SDcols = "a"]
     a
1: 5.5
Run Code Online (Sandbox Code Playgroud)

有趣的是,weighted.mean当我weighted.mean(.SD)在j中使用时,给出了错误的答案(55,总和).但是当我lapply(.SD, weighted.mean)在j中使用时,它给出了正确答案(5.5,均值).

我试图关闭data.table优化,以查看它是否是内部data.table平均函数,但这并没有改变.

也许这只是mean()在列表上使用的问题(这似乎是什么.SD回报)?我想从来没有理由不使用lapply范式.SD?似乎只有该lapply选项返回data.table.其他人似乎返回向量,除了返回其他东西的colMeans(列表?).

我的主要问题是为什么mean(.SD)不起作用.并且推论是否.SD可以在没有应用函数的情况下使用.

谢谢.

小智 2

我认为实现您想要的内容的适当方法是仅使用标准语法:

dt[ , lapply(.SD, mean), .SDcols = "a"]

或者,您可以按名称传递变量,如下所示:

col_to_pass = "a"
dt[ , mean(get(col_to_pass)) ]
Run Code Online (Sandbox Code Playgroud)

最终,您可以将此方法推广到多个列,如下所示:

col_to_pass = c("a", "d")
dt[ , lapply( mget(col_to_pass), mean) ]
Run Code Online (Sandbox Code Playgroud)