gpt4 book ai didi

r - 在 data.table 中使用平均值与 .SD 和 .SDcols

转载 作者:行者123 更新时间:2023-12-02 11:19:33 28 4
gpt4 key购买 nike

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

所以,我正在使用 .SDcols传入要汇总的列,并使用 .SD 上的函数在 j data.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

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

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

也许这只是使用 mean() 的问题在列表中(这似乎是 .SD 返回的内容)?我想永远没有理由不使用 lapply范式与 .SD ?似乎只有 lapply选项返回一个 data.table。其他似乎返回向量,除了 colMeans 返回其他内容(列表?)。

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

谢谢。

最佳答案

我认为接近你想要的东西的合适方法是使用标准语法:
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) ]

关于r - 在 data.table 中使用平均值与 .SD 和 .SDcols,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29568732/

28 4 0