簡體   English   中英

帶兩個分組變量的r data.table中的條件計數

[英]Conditional count in r data.table with two grouping variables

我有一個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中的摩洛哥max(...) ,如果在給定的群集中有很多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之后不能將其用作分組變量?

任何見解將不勝感激。

您可以在i排除NA

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM