【发布时间】:2015-06-16 14:29:01
【问题描述】:
我正在编写一个非常简单的函数来汇总 data.tables 的列。我一次将一列传递给函数,然后进行一些诊断以找出汇总选项,然后进行汇总。我在 data.table 中这样做是为了允许一些非常大的数据集。
所以,我使用.SDcols 传递列进行汇总,并在data.table 表达式的j 部分中使用.SD 上的函数。由于我一次只传递一列,因此我没有使用 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(.SD) 时,weighted.mean 给出了错误的答案(55,总和)。但是当我在 j 中使用 lapply(.SD, weighted.mean) 时,它给出了正确的答案(5.5,平均值)。
我尝试关闭 data.table 优化以查看它是否是内部 data.table 均值函数,但这并没有改变。
也许这只是在列表上使用mean() 的问题(这似乎是.SD 返回的内容)?我想没有理由不将lapply 范式与.SD 一起使用?似乎只有lapply 选项返回一个data.table。其他似乎返回向量,除了 colMeans 返回其他东西(列表?)。
我的主要问题是为什么mean(.SD) 不起作用。推论是 .SD 是否可以在没有应用功能之一的情况下使用。
谢谢。
【问题讨论】:
-
dt[, mean(.SD[[1]]), .SDcols=a]mean作用于vector,.SD是data.table的子集,它仍然不是向量。data.frame也会遇到同样的问题。例如。df1 <- data.frame(Col1=1:10); mean(df1[1]),而mean(df1[,1])有效 -
您应该尝试代码块(CTRL+K 或按代码块按钮突出显示文本;或在行首输入四个空格):stackoverflow.com/editing-help#code
-
@akrun:这很有趣,也很有意义。 R 错误消息似乎具有误导性。这表明这是数据类型(数字或逻辑)而不是数据结构的问题。
-
@Frank:谢谢。那会容易得多。感谢您的帮助。
-
@MarkDanese 我记得在 R 邮件列表中有一个关于这个问题的有趣讨论,但我现在找不到链接。
标签: r data.table mean