【问题标题】:data.table : column name not working with j = c() and bydata.table :列名不适用于 j = c() 和 by
【发布时间】:2017-09-04 13:30:01
【问题描述】:

很难提出我的问题(因此很难在档案中有效地搜索......)。下面的代码应该很清楚了。

为什么在第二个命令中输出的最后一列名称不是“nb_ob”? c(lapply(.SD, mean), nb_obs = .N) 应该提供一个包含 4 个元素的命名列表,这些元素应该成为最终结果中的一列。

奇怪的是c(lapply(.SD[,1:4], mean), nb_obs = .N)(第三条命令)提供了预期的结果。如果我删除 by 参数(最后一个命令),我还将获得预期的列名(对字符列“物种”发出警告)。

使用 data.table_1.10.4 运行的代码,适用于 Ubuntu 16.04.3 LTS 的 R 版本 3.4.1(如果需要,我可以提供更多)

iris <- data.table(iris)
iris[, c(lapply(.SD, mean), nb_obs = .N), by = Species] # 2nd command
#       Species Sepal.Length Sepal.Width Petal.Length Petal.Width  N
# 1:     setosa        5.006       3.428        1.462       0.246 50
# 2: versicolor        5.936       2.770        4.260       1.326 50
# 3:  virginica        6.588       2.974        5.552       2.026 50

iris[, c(lapply(.SD[,1:4], mean), nb_obs = .N), by = Species] # 3rd command
#       Species Sepal.Length Sepal.Width Petal.Length Petal.Width nb_obs
# 1:     setosa        5.006       3.428        1.462       0.246     50
# 2: versicolor        5.936       2.770        4.260       1.326     50
# 3:  virginica        6.588       2.974        5.552       2.026     50

iris[, c(lapply(.SD, mean), nb_obs = .N)] # Fourth command
#    Sepal.Length Sepal.Width Petal.Length Petal.Width Species nb_obs
# 1:     5.843333    3.057333        3.758    1.199333      NA    150

【问题讨论】:

  • 我认为它与GForce有关。当我使用options(datatable.optimize = 0L) 关闭优化时,第二个命令也将给出与第三个相同的输出。这可能是因为使用.SD[, 1:4] 具有与图灵GForce 类似的效果。无论如何,对于这份工作,我会尝试iris[, c(lapply(.SD, mean), list(nb_obs = .N)), by = Species]
  • 我猜nb_obs 在优化过程中强制.N 到列表时会被忽略。
  • 据我所知,mt1022 是正确的,这要归功于优化覆盖名称。我最近提交了一个相关问题github.com/Rdatatable/data.table/issues/2311
  • 我的一个类似问题:Do we need to convert single elements of j to a list when the overall result of j is a list anyway?,以及我之后发布的问题:Possible inconsistencies in the autonaming and renaming of .N。 @mt1022 感谢您对 GForce 的建议。
  • 好的,谢谢。我知道这种行为不是预期的行为(这对我来说并不明显,因为我是 data.table 的真正初学者)。我希望会有一个修复。同时@mt1022 和c(lapply(.SD, mean), list(nb_obs = .N)) 的解决方案很有用。

标签: r data.table


【解决方案1】:

这是基于此问题提出的data.table 项目积压中的问题:


这个答案是基于@Frank 上面的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多