【发布时间】:2019-09-05 19:52:16
【问题描述】:
我有一个data.table,其中有属于多个分组的记录。我想计算两个变量属于同一组的记录数,其中分组变量可能包括一些 NA。
以下示例数据:
library(data.table)
mydt <- data.table(id = c(1,2,3,4,5,6),
travel = c("no travel", "morocco", "algeria",
"morocco", "morocco", NA),
cluster = c(1,1,1,2,2,2))
> mydt
id travel cluster
1: 1 no travel 1
2: 2 morocco 1
3: 3 algeria 1
4: 4 morocco 2
5: 5 morocco 2
6: 6 <NA> 2
在上面的例子中,我想按集群计算有多少人前往每个目的地。
最初我使用.N 表示法执行此操作,如下所示:
mydt[, ndest1 := as.double(.N), by = c("cluster", "travel")]
> mydt
id travel cluster ndest1
1: 1 no travel 1 1
2: 2 morocco 1 1
3: 3 algeria 1 1
4: 4 morocco 2 2
5: 5 morocco 2 2
6: 6 <NA> 2 1
但是,NA 被计为一个值 - 这对我的目的并不适用,因为我稍后想使用 max(...) 来确定每个集群中最多人前往的目的地(上述集群 2 中的摩洛哥),如果给定集群中有很多 NA,“NA”将被错误地标记为最受欢迎的目的地。
然后我尝试改用sum(),因为这很直观,并且还允许我排除 NA:
mydt[, ndest2 := sum(!is.na(travel)), by = c("cluster", "travel")]
> mydt
id travel cluster ndest1 ndest2
1: 1 no travel 1 1 1
2: 2 morocco 1 1 1
3: 3 algeria 1 1 1
4: 4 morocco 2 2 1
5: 5 morocco 2 2 1
6: 6 <NA> 2 1 0
这给出了不正确的结果 - 经过一些进一步的测试,这似乎是因为我在sum(...) 中的逻辑语句中使用了相同的变量作为by 语句中的分组变量之一。
当我使用不同的变量时,我得到了想要的结果,只是我无法以这种方式排除 NA:
mydt[, ndest3 := sum(!is.na(id)), by = c("cluster", "travel")]
> mydt
id travel cluster ndest1 ndest2 ndest3
1: 1 no travel 1 1 1 1
2: 2 morocco 1 1 1 1
3: 3 algeria 1 1 1 1
4: 4 morocco 2 2 1 2
5: 5 morocco 2 2 1 2
6: 6 <NA> 2 1 0 1
这引出了两个问题:
- 在 data.table 条件计数中,如何排除 NA?
- 为什么不能在求和逻辑语句中使用同一个变量,并在
by之后作为分组变量?
任何见解将不胜感激。
【问题讨论】:
标签: r count data.table conditional na