Условный счет в r data.table с двумя группирующими переменными - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть 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

Этоприводит меня к двум вопросам:

  1. В условном подсчете data.table как мне исключить NA?
  2. Почему нельзя использовать одну и ту же переменную в statemtent суммы логики икак группирующая переменная после by?

Любые идеи будут высоко оценены.

1 Ответ

2 голосов
/ 15 апреля 2019

Вы можете исключить NA s в i

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
...