我正在编写一个非常简单的函数来汇总data.tables列.我一次将一列传递给函数,然后进行一些诊断以找出汇总选项,然后进行汇总.我在data.table中这样做,以允许一些非常大的数据集.
所以,我.SDcols用来传递列总结,并.SD在jdata.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)
| 归档时间: |
|
| 查看次数: |
4930 次 |
| 最近记录: |