【问题标题】:using mean with .SD and .SDcols in data.table在 data.table 中使用带有 .SD 和 .SDcols 的平均值
【发布时间】: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.SDdata.table 的子集,它仍然不是向量。 data.frame 也会遇到同样的问题。例如。 df1 &lt;- 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


【解决方案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) ]

【讨论】:

    猜你喜欢
    • 2019-02-05
    • 1970-01-01
    • 2020-02-09
    • 2014-06-10
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2016-12-14
    相关资源
    最近更新 更多