#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