[英]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
這使我想到兩個問題:
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.