带有两个分组变量的r data.table中的条件计数

问题描述 投票:0回答:1

我有一个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

但是,NAs被视为一个值 - 这对我的目的来说效果不好,因为我后来想要使用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

这引出了两个问题:

  1. 在data.table条件计数中,如何排除NA?
  2. 为什么在sum逻辑语句中不能使用相同的变量,在qazxsw poi之后作为分组变量?

任何见解都将非常感激。

r count data.table conditional na
1个回答
2
投票

你可以在by中排除NAs

i
© www.soinside.com 2019 - 2024. All rights reserved.