【问题标题】:Conditional count in r data.table with two grouping variables具有两个分组变量的 r data.table 中的条件计数
【发布时间】: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

这引出了两个问题:

  1. 在 data.table 条件计数中,如何排除 NA?
  2. 为什么不能在求和逻辑语句中使用同一个变量,并在by之后作为分组变量?

任何见解将不胜感激。

【问题讨论】:

    标签: r count data.table conditional na


    【解决方案1】:

    您可以在i 中排除NAs

    mydt[!is.na(travel), ndest1 := .N, by = .(travel, cluster)][]
    #   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     NA
    

    【讨论】:

    • 我避免在左侧放置一些东西,因为在其他情况下我需要为每个集群设置一个值,但忘记了在这种情况下我确实希望继承 NA,所以这会起作用。仍然很想了解 sum / by 冲突发生了什么。
    猜你喜欢
    • 2015-06-19
    • 2022-01-11
    • 1970-01-01
    • 2013-08-09
    • 2014-09-30
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    相关资源
    最近更新 更多