У меня есть 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 считаются какзначение - это не очень хорошо для моих целей, так как позже я хочу определить, какой пункт назначения в каждом кластере посещал большинство людей (Марокко в кластере 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(...)
, что и одинf группирующие переменные в операторе 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
Этоприводит меня к двум вопросам:
- В условном подсчете data.table как мне исключить NA?
- Почему нельзя использовать одну и ту же переменную в statemtent суммы логики икак группирующая переменная после
by
?
Любые идеи будут высоко оценены.