Как кросс-таблицы пропусков с data.table - PullRequest
0 голосов
/ 15 января 2019

Скажем, у нас есть этот игрушечный пример:

prueba <- data.table(aa=1:7,bb=c(1,2,NA, NA, 3,1,1),
cc=c(1,2,NA, NA, 3,1,1) , YEAR=c(1,1,1,2,2,2,2))

   aa bb cc YEAR
1:  1  1  1    1
2:  2  2  2    1
3:  3 NA NA    1
4:  4 NA NA    2
5:  5  3  3    2
6:  6  1  1    2
7:  7  1  1    2

Я хочу создать таблицу со значениями чего-либо по ГОДУ. В этом простом примере я просто попрошу таблицу, в которой указано, сколько у меня пропавших и не пропущенных.

Это ужасный способ сделать это, указав все вручную:

prueba[,.(sum(is.na(.SD)),sum(!is.na(.SD))), by=YEAR]

Хотя он не помечает автоматически новые столбцы, которые мы видим, он говорит, что у меня есть 2 пропущенных и 7 не пропущенных значений за год 1, и ...

   YEAR V1 V2
1:    1  2  7
2:    2  2 10

Это работает, но мне бы хотелось иметь возможность использовать table () или некоторую эквивалентную команду data.table вместо указания вручную каждого термина. Это было бы намного эффективнее, если бы у меня их было много или мы не знали их заранее.

Я пробовал с:

prueba[,table(is.na(.SD)), by=YEAR]

но это не работает, я получаю это:

   YEAR V1
1:    1  7
2:    1  2
3:    2 10
4:    2  2

Как я могу получить тот же формат, что и выше?
Я, к несчастью, попытался с помощью as.datable, unlist, lapply и других вещей. Я думаю, что некоторые люди используют dcast, но я не знаю, как использовать его здесь.
Есть ли простой способ сделать это? Мой настоящий стол очень большой. Лучше использовать имена столбцов вместо .SD?

1 Ответ

0 голосов
/ 15 января 2019

Вы можете преобразовать таблицу в список, если хотите, чтобы она представляла собой два отдельных столбца

prueba[, as.list(table(is.na(.SD))), by=YEAR]

#    YEAR FALSE TRUE
# 1:    1     7    2
# 2:    2    10    2

Я предлагаю не использовать TRUE и FALSE в качестве имен столбцов.

prueba[, setNames(as.list(table(is.na(.SD))), c('notNA', 'isNA'))
       , by = YEAR]

#    YEAR notNA isNA
# 1:    1     7    2
# 2:    2    10    2

Другой вариант - добавить новый столбец, а затем dcast

.
na_summ <- prueba[, table(is.na(.SD)), by = YEAR] 
na_summ[, vname := c('notNA', 'isNA'), YEAR] 
dcast(na_summ, YEAR ~ vname, value.var = 'V1')

#    YEAR isNA notNA
# 1:    1    2     7
# 2:    2    2    10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...