我有一个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
这引出了两个问题:
任何见解都将非常感激。
你可以在by
中排除NA
s
i