【问题标题】:R - data.table not grouping when using withR - 使用 with 时 data.table 不分组
【发布时间】:2015-11-11 19:51:25
【问题描述】:

更新 - with = F 似乎与 j 中的表达式不兼容,并且与(至少某些)by = 情况不兼容。

采用以下场景并尽可能简化:

dt <- data.table(group1 = c("a", "a", "a", "b", "b", "b"),
                 group2 = c("x", "x", "y", "y", "z", "z"),
                 data = c(rep(T, 3), rep(F, 3)))

dt[
  ,
  3,
  with = F,
  by = list(group1, group2)
]

    data
1:  TRUE
2:  TRUE
3:  TRUE
4: FALSE
5: FALSE
6: FALSE
> 

dt[
  ,
  data,
  by = list(group1, group2)
]

   group1 group2  data
1:      a      x  TRUE
2:      a      x  TRUE
3:      a      y  TRUE
4:      b      y FALSE
5:      b      z FALSE
6:      b      z FALSE
>

表达式行为在?data.table中以迂回的方式记录:

单个列名,单个列名表达式,list() 列名表达式,计算结果为列表的表达式或函数调用(包括 data.frame 和 data.table,它们也是列表) , 或(当 with=FALSE 时)要选择的名称或位置向量

我在文档中没有看到任何关于 with = F 禁用 by = 的文档,但在这种情况下似乎确实如此。


我遇到了一个问题,data.table 使用或忽略 by =,具体取决于我是否使用 with = F

library(data.table)

dt <- data.table(group1 = c("a", "a", "a", "b", "b", "b"),
                 group2 = c("x", "x", "y", "y", "z", "z"),
                 data = c(rep(T, 3), rep(F, 3)))

# without with = F

dt[
  as.vector(!is.na(dt[, 3, with = F])),
  sum(data),
  by = list(group1, group2)
]
>
   group1 group2 V1
1:      a      x  2
2:      a      y  1
3:      b      y  0
4:      b      z  0 

# with = F

dt[
  as.vector(!is.na(dt[, 3, with = F])),
  sum(3),
  with = F,
  by = list(group1, group2)
]
>
    data
1:  TRUE
2:  TRUE
3:  TRUE
4: FALSE
5: FALSE
6: FALSE

我尝试使用数字向量和by = 的字符向量,但都不起作用。

sum() 是一个示例函数,当我不使用 j 上的函数时,我遇到了同样的基本问题。

最后,我需要使用with = Ffor 循环中遍历data.table 的多个列。

有什么建议吗?

【问题讨论】:

  • 我猜你正在寻找这个:dt[!is.na(3), sum(data), by = .(group1, group2)]as.vector(!is.na(dt[, 3, with = F])) 的部分使事情变得过于复杂。相反,您可以使用:!is.na(3)
  • @Jaap,我认为他们想使用“3”而不是“数据”......
  • 没错,我需要在 for 循环中对其进行迭代。真的有data的多列。
  • @AnandaMahto 改了,但基本上是一样的。
  • 您能解释一下预期的输出应该是什么吗?

标签: r data.table


【解决方案1】:

具有命名列的数据的一个好的经验法则是 - 永远不要使用列号 - 列有时会重新排列,这可能会使您的代码完全损坏。当然,对于任何经验法则,都有例外,但您需要证明您的案例值得例外,所以我假设现在不是。

所以,如果你正在输入你会做的代码:

dt[!is.na(data), sum(data), by = .(group1, group2)]

如果你在变量中使用列名,你会这样做:

col = "data"
dt[!is.na(get(col)), sum(get(col)), by = .(group1, group2)]

至于将bywith = FALSE 一起使用-该模式旨在与data.frame 兼容,它没有by 参数,但即使您支持by 参数,结果将是微不足道的,因为j-expressionwith = FALSE 模式下总是被解释为一个完整的列(就像在data.frame 中一样)。

【讨论】:

  • 学习 eddi 的经验法则,谢谢。 with = F 上的上下文对于了解幕后发生的事情非常有帮助。
  • @TheTime 如果您需要使用矩阵索引,我猜您选择了错误的数据结构,但如果您没有 - 常规列表索引在极少数情况下足够紧凑 - 例如dt[[2]]
  • @TheTime 使用列名 - 我不明白您为什么要为此使用列号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2020-03-29
  • 1970-01-01
相关资源
最近更新 更多