Распространение данных внутри канала dplyr; работа с несколькими записями по группам

#r #dataframe #dplyr #tidyr

Вопрос:

Я пытаюсь преобразовать длинный кадр данных в широкий кадр данных, используя spread функцию в tidyr dplyr канале и внутри него. Мои данные представлены в следующем формате:-

 dflt;-structure(list(Hour = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L,   1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L),   dt = c("05/06/2021", "07/06/2021", "08/06/2021", "10/06/2021",   "12/06/2021", "12/06/2021", "14/06/2021", "14/06/2021", "15/06/2021",   "09/06/2021", "10/06/2021", "10/06/2021", "11/06/2021", "13/06/2021",   "14/06/2021", "05/06/2021", "06/06/2021", "07/06/2021", "08/06/2021",   "08/06/2021", "09/06/2021", "09/06/2021", "10/06/2021", "11/06/2021",   "12/06/2021"), Programme_watched = c("Wrestling", "Drama",   "Drama", "Football", "Rugby", "Movie", "Movie", "News", "Music",   "Tennis", "Racing", "Racing", "Documentary ", "Movie", "Movie",   "Athletics", "News", "Children", "Music", "Movie", "Football",   "News", "Football", "Rugby", "Drama")), class = "data.frame", row.names = c(NA,   -25L))   df   Hour dt Programme_watched 1 0 05/06/2021 Wrestling 2 0 07/06/2021 Drama 3 0 08/06/2021 Drama 4 0 10/06/2021 Football 5 0 12/06/2021 Rugby 6 0 12/06/2021 Movie 7 0 14/06/2021 Movie 8 0 14/06/2021 News 9 0 15/06/2021 Music 10 1 09/06/2021 Tennis 11 1 10/06/2021 Racing 12 1 10/06/2021 Racing 13 1 11/06/2021 Documentary  14 1 13/06/2021 Movie 15 1 14/06/2021 Movie 16 2 05/06/2021 Athletics 17 2 06/06/2021 News 18 2 07/06/2021 Children 19 2 08/06/2021 Music 20 2 08/06/2021 Movie 21 2 09/06/2021 Football 22 2 09/06/2021 News 23 2 10/06/2021 Football 24 2 11/06/2021 Rugby 25 2 12/06/2021 Drama   

Я хочу сделать это шире, превратив даты в заголовки столбцов с Programme_watched переменной в качестве значения. Тем не менее, это то, что я получаю:-

 df%gt;%  group_by(Hour,dt)%gt;%  summarise(Programmes=Programme_watched)%gt;%  spread(dt, Programmes)   `summarise()` has grouped output by 'Hour', 'dt'. You can override using the `.groups` argument. Error: Each row of output must be identified by a unique combination of keys. Keys are shared for 10 rows: * 19, 20 * 21, 22 * 11, 12 * 5, 6 * 7, 8  

Связано ли это с тем, что для некоторых группирующих переменных существует более одного значения, т. е. Hour и dt ? Если это так, я бы хотел, чтобы эти два значения были вставлены в одну ячейку вместе, а затем распределены по dt переменной. Кто-нибудь может помочь?

Ответ №1:

Также можно создать последовательность по группам ( rowid ) перед pivot_wider тем, как позаботиться о повторяющихся элементах

 library(data.table) library(tidyr) library(dplyr) df%gt;%  group_by(Hour,dt)%gt;%  summarise(Programmes=Programme_watched, .groups = 'drop') %gt;%   mutate(rn = rowid(Hour, dt)) %gt;%   pivot_wider(names_from = dt, values_from = Programmes) %gt;%  select(-rn)  

-выход

 # A tibble: 6 × 12  Hour `05/06/2021` `07/06/2021` `08/06/2021` `10/06/2021` `12/06/2021` `14/06/2021` `15/06/2021` `09/06/2021` `11/06/2021` `13/06/2021` `06/06/2021`  lt;intgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt;  1 0 Wrestling Drama Drama Football Rugby Movie Music lt;NAgt; lt;NAgt; lt;NAgt; lt;NAgt;  2 0 lt;NAgt; lt;NAgt; lt;NAgt; lt;NAgt; Movie News lt;NAgt; lt;NAgt; lt;NAgt; lt;NAgt; lt;NAgt;  3 1 lt;NAgt; lt;NAgt; lt;NAgt; Racing lt;NAgt; Movie lt;NAgt; Tennis "Documentary " Movie lt;NAgt;  4 1 lt;NAgt; lt;NAgt; lt;NAgt; Racing lt;NAgt; lt;NAgt; lt;NAgt; lt;NAgt; lt;NAgt; lt;NAgt; lt;NAgt;  5 2 Athletics Children Music Football Drama lt;NAgt; lt;NAgt; Football "Rugby" lt;NAgt; News  6 2 lt;NAgt; lt;NAgt; Movie lt;NAgt; lt;NAgt; lt;NAgt; lt;NAgt; News lt;NAgt; lt;NAgt; lt;NAgt;   

Комментарии:

1. Этот лучше. Я искал это rowid в своем мозгу, но был введен в заблуждение rleid !

Ответ №2:

Вы ищете такое решение? spread заменяется:

Разработка spread() завершена, и для нового кода мы рекомендуем переключиться на pivot_wider() более простой в использовании, более функциональный и все еще находящийся в стадии активной разработки. df %gt;% spread(key, value) эквивалентно df %gt;% pivot_wider(names_from = key, values_from = value)

 df%gt;%  group_by(Hour,dt)%gt;%  summarise(Programmes=Programme_watched) %gt;%   ungroup() %gt;%   pivot_wider(  names_from= dt,   values_from = Programmes  ) %gt;%   unnest()  
 # A tibble: 6 x 12  Hour `05/06/2021` `07/06/2021` `08/06/2021` `10/06/2021` `12/06/2021` `14/06/2021` `15/06/2021`  lt;intgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt;  1 0 Wrestling Drama Drama Football Rugby Movie Music  2 0 Wrestling Drama Drama Football Movie News Music  3 1 NA NA NA Racing NA Movie NA  4 1 NA NA NA Racing NA Movie NA  5 2 Athletics Children Music Football Drama NA NA  6 2 Athletics Children Movie Football Drama NA NA  # ... with 4 more variables: 09/06/2021 lt;chrgt;, 11/06/2021 lt;chrgt;, 13/06/2021 lt;chrgt;, 06/06/2021 lt;chrgt;  

или

 library(tidyr) library(dplyr) df %gt;%  pivot_wider(  names_from= dt,   values_from = Programme_watched  ) %gt;%   unnest() %gt;%   distinct()  
 Hour `05/06/2021` `07/06/2021` `08/06/2021` `10/06/2021` `12/06/2021` `14/06/2021` `15/06/2021` `09/06/2021` `11/06/2021` `13/06/2021` `06/06/2021`  lt;intgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt;  1 0 Wrestling Drama Drama Football Rugby Movie Music NA NA NA NA  2 0 Wrestling Drama Drama Football Movie News Music NA NA NA NA  3 1 NA NA NA Racing NA Movie NA Tennis "Documentary " Movie NA  4 2 Athletics Children Music Football Drama NA NA Football "Rugby" NA News  5 2 Athletics Children Movie Football Drama NA NA News "Rugby" NA News