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

时间:2015-04-10 18:52:42

标签: r data.table mean

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

因此,我使用.SDcols传递列进行汇总,并在data.table表达式的.SD部分使用j上的函数。由于我一次只传递一列,所以我没有使用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

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

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

也许这只是在列表上使用mean()的问题(这似乎是.SD返回的内容)?我想从来没有理由不将lapply范例与.SD一起使用?似乎只有lapply选项返回data.table。其他人似乎返回向量,除了返回其他东西的colMeans(列表?)。

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

感谢。

1 个答案:

答案 0 :(得分:1)

我认为处理所需内容的适当方法是仅使用标准语法:

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

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

col_to_pass = "a"
dt[ , mean(get(col_to_pass)) ]

最终,您可以将这种方法推广到以下多个列:

col_to_pass = c("a", "d")
dt[ , lapply( mget(col_to_pass), mean) ]