R - data.table在使用时不进行分组

时间:2015-11-11 19:51:26

标签: r data.table

更新 - 似乎with = Fj中的表达式以及(至少某些)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

中的回旋方式记录

单个列名,列名的单个表达式,列名表达式的列表(),计算结果列表的表达式或函数调用(包括data.frame和data.table也是列表) ,或(当= = 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 = Fdata.table循环中迭代for的多个列。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

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

所以,如果你输入了你要做的代码:

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-expression将始终被解释为with = FALSE模式中的完整列(就像在data.frame中一样)。