агрегирование строк по идентификатору в несколько столбцов, где количество строк в идентификаторе изменяется (R) - PullRequest
0 голосов
/ 15 декабря 2018

Мой вопрос был закрыт из-за того, что я был дубликатом, так как я не очень хорошо себя объяснил.Здесь есть проблема, которая с тех пор помешала моему использованию сбора-объединения-распространения dplyr.Обычно это простая задача, но есть несколько проблем, которые затрудняют реализацию этого набора данных.

У меня есть следующий набор данных

ID   V.1  V.2  V.3  V.4
1    x    y    Z    0
1    x    y    Z    0
1    x    y    Z    0
1    x    y    Z    1
2    x    y    Z    0 
2    x    y    Z    1
3    x    y    Z    0
3    x    y    Z    1

Набор данных должен выглядеть следующим образом

ID V.1a V.2a V.3a V.1b V.2b V.3b V.1c V.2c V.3c V.1d V.2d V.3d V.4
1  x    y    z    x    y    z    x    y    z    x    y    z    4
2  x    y    z    x    y    z    na   na   na   na   na   na   2 
3  x    y    z    x    y    z    na   na   na   na   na   na   2 

Проблема - количество строк на уникальный идентификатор варьируется

Это, похоже, моя самая большая проблема.Это привело к тому, что количество столбцов было неравномерным, и мой обычный способ агрегирования не работал.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 15 декабря 2018

Вот способ использования data.table

library(data.table)
setDT(dat)
out <- dcast(dat, ID ~ rowid(ID), value.var = c("V.1", "V.2", "V.3"))[
  dat[, .('V.4' = length(V.4)), by = ID], on = "ID"
]
out
#   ID V.1_1 V.1_2 V.1_3 V.1_4 V.2_1 V.2_2 V.2_3 V.2_4 V.3_1 V.3_2 V.3_3 V.3_4 V.4
#1:  1     x     x     x     x     y     y     y     y     Z     Z     Z     Z   4
#2:  2     x     x  <NA>  <NA>     y     y  <NA>  <NA>     Z     Z  <NA>  <NA>   2
#3:  3     x     x  <NA>  <NA>     y     y  <NA>  <NA>     Z     Z  <NA>  <NA>   2

Мы используем dcast для расширения столбцов от V.1 до V.3 от длинных к широким и присоединяем результат к dat[, .('V.4' = length(V.4)), by = ID], который просто агрегируетстолбец V.4.

Используйте setDF(out), если хотите продолжить работу с data.frame.

данные

dat <- read.table(text = 'ID   V.1  V.2  V.3  V.4
1    x    y    Z    0
1    x    y    Z    0
1    x    y    Z    0
1    x    y    Z    1
2    x    y    Z    0 
2    x    y    Z    1
3    x    y    Z    0
3    x    y    Z    1',
                  header = TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...