Преобразовать несколько столбцов заголовка большого набора данных в строки - PullRequest
1 голос
/ 23 апреля 2020

У меня есть следующий фрейм данных (здесь показана голова), и он грязный.

orig     dest   1997    2002      2006   2010     2016    1997    2002      2006   2010     2016 
Seoul   Inchon   543    524       364     452       845     543    524         364    452     845 
Seoul   Gyeongi  543    524       364     452       845     543    524         364    452     845
Inchon  Seoul    543    524       364     452       845     543    524         364    452     845

Я хочу преобразовать свой набор данных в следующий формат (он содержит 7000 наблюдений, и я только что показал заголовок набора данных): я хочу получить (1997-2016 годы в одном столбце с именем " cartrip ") и (1997-2016 под другим столбцом под названием" ходьба ")

Year orig  dest      cartrip  walking 
1997 Seoul Incheon   543      543 
2002 Seoul Incheon   524      524  
2006 Seoul Incheon   364      364
2010 Seoul Incheon   452      452
2016 Seoul Incheon   845      845
1997 Seoul Gyeongi   543      543 
2002 Seoul Gyeongi   524      524  
2006 Seoul Gyeongi   364      364
2010 Seoul Gyeongi   452      452
2016 Seoul Gyeongi   845      845

Я пытался собрать, но это не сработало.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

У вас не должно быть повторяющихся имен столбцов в кадре данных, мы исправляем это, используя make.unique.

names(df) <- make.unique(names(df))

Затем мы можем удалить пустые строки и получить данные в длинном формате, используя pivot_longer.

library(dplyr)
library(tidyr)

df %>%
  filter(orig != '' | dest != '') %>%
  pivot_longer(cols = -c(orig, dest), 
               names_to = c('.value', 'index'), 
               names_sep = '\\.') %>%
  select(-index)

Для обновленного набора данных мы можем использовать:

df %>%
  pivot_longer(cols = -c(orig, dest), names_to = 'year') %>%
  mutate(.copy = c('cartrip', 'walking')[.copy]) %>%
  pivot_wider(names_from = .copy, values_from = value)

#   orig   dest    year  cartrip walking
#   <fct>  <fct>   <chr>   <int>   <int>
# 1 Seoul  Inchon  1997      543     543
# 2 Seoul  Inchon  2002      524     524
# 3 Seoul  Inchon  2006      364     364
# 4 Seoul  Inchon  2010      452     452
# 5 Seoul  Inchon  2016      845     845
# 6 Seoul  Gyeongi 1997      543     543
# 7 Seoul  Gyeongi 2002      524     524
# 8 Seoul  Gyeongi 2006      364     364
# 9 Seoul  Gyeongi 2010      452     452
#10 Seoul  Gyeongi 2016      845     845
#11 Inchon Seoul   1997      543     543
#12 Inchon Seoul   2002      524     524
#13 Inchon Seoul   2006      364     364
#14 Inchon Seoul   2010      452     452
#15 Inchon Seoul   2016      845     845
0 голосов
/ 23 апреля 2020

a data.table решение. Возможно, вам придется поиграть с year. Поскольку melt сейчас в data.table не может правильно обработать year в вашем вопросе. Я думаю, pivot_longer из tidyr может сделать это за один выстрел.

library(data.table)

df <- fread('orig   dest    cartrip cartrip cartrip cartrip cartrip walking walking walking walking walking
        1997    2002    2006    2010    2016    1997    2002    2006    2010    2016
Seoul   Inchon  543 524 364 452 845 543 524 364 452 845
Seoul   Gyeongi 543 524 364 452 845 543 524 364 452 845
Inchon  Seoul   543 524 364 452 845 543 524 364 452 845
')


result <- melt(df[orig!="",],measure.vars = patterns(walking="^walking",cartrip="^cartrip"),variable.name = "year")

result[,year:=forcats::lvls_revalue(year,c("1997", "2002", "2006", "2010", "2016")
)]

result[order(orig,dest)][,.(year,orig,dest,cartrip,walking)]
#>     year   orig    dest cartrip walking
#>  1: 1997 Inchon   Seoul     543     543
#>  2: 2002 Inchon   Seoul     524     524
#>  3: 2006 Inchon   Seoul     364     364
#>  4: 2010 Inchon   Seoul     452     452
#>  5: 2016 Inchon   Seoul     845     845
#>  6: 1997  Seoul Gyeongi     543     543
#>  7: 2002  Seoul Gyeongi     524     524
#>  8: 2006  Seoul Gyeongi     364     364
#>  9: 2010  Seoul Gyeongi     452     452
#> 10: 2016  Seoul Gyeongi     845     845
#> 11: 1997  Seoul  Inchon     543     543
#> 12: 2002  Seoul  Inchon     524     524
#> 13: 2006  Seoul  Inchon     364     364
#> 14: 2010  Seoul  Inchon     452     452
#> 15: 2016  Seoul  Inchon     845     845

Создано в 2020-04-23 пакетом Представить (v0.3.0)

...