我正在编写一个非常简单的函数来汇总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可以在没有应用函数的情况下使用。
感谢。
答案 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) ]