Таблица Spread и Gather возвращает дублированные строки со значениями NA - PullRequest
1 голос
/ 08 апреля 2019

У меня есть таблица с категориями и подкатегориями, закодированными в этом формате имени столбца:

Дата | Прием __0 | Посещаемость __0 | Tri_1__0 | Tri_2__0 | ... Tri_1__1 | Tri_2__1 | ... |

и я хотел бы изменить его на этот формат столбцов , используя функцию распространения и сбора tidyverse:

Дата | Код страны | Поступающие | Участники | Tri_1 | Tri_2 | ...

Я попытался опубликовать решение, но результат фактически возвращает несколько строк с NA, а не одну строку.

Используется мой код:

temp <- data %>% gather(key="columns",value ="dt",-Date) 

temp <- temp %>% mutate(category = gsub(".*__","",columns)) %>% mutate(columns = gsub("__\\d","",columns))

temp %>%  mutate(row = row_number()) %>% spread(key="columns",value="dt") 

И мои результаты:

Date        country_code   row admissions attendance Tri_1 Tri_2 Tri_3 Tri_4 Tri_5
   <chr>       <chr>        <int> <chr>      <chr>      <chr> <chr> <chr> <chr> <chr>
 1 01-APR-2014 0              275 NA         209        NA    NA    NA    NA    NA   
 2 01-APR-2014 0              640 84         NA         NA    NA    NA    NA    NA   
 3 01-APR-2014 0             1005 NA         NA         5     NA    NA    NA    NA   
 4 01-APR-2014 0             1370 NA         NA         NA    33    NA    NA    NA   
 5 01-APR-2014 0             1735 NA         NA         NA    NA    62    NA    NA   
 6 01-APR-2014 0             2100 NA         NA         NA    NA    NA    80    NA   
 7 01-APR-2014 0             2465 NA         NA         NA    NA    NA    NA    29   
 8 01-APR-2014 1             2830 NA         138        NA    NA    NA    NA    NA   
 9 01-APR-2014 1             3195 66         NA         NA    NA    NA    NA    NA   
10 01-APR-2014 1             3560 NA         NA         N/A   NA    NA    NA    NA  

Мои ожидаемые результаты:

Date        country_code   row admissions attendance Tri_1 Tri_2 Tri_3 Tri_4 Tri_5
   <chr>       <chr>        <int> <chr>      <chr>      <chr> <chr> <chr> <chr> <chr>
 1 01-APR-2014 0              275 84         209        5    33    62    80    29   
 8 01-APR-2014 1             2830 66         138        66   ...   ...   ...   ...   

1 Ответ

0 голосов
/ 08 апреля 2019

Мы можем сделать summarise_at coalesce для удаления элементов NA после spread

library(tidyverse)
data %>% 
  gather(key = "columns", val = "dt", -Date, na.rm = TRUE) %>%
  mutate(category = gsub(".*__","",columns)) %>%
  mutate(columns = gsub("__\\d","",columns)) %>% 
  group_by(Date, dt, columns, category) %>% 
  mutate(rn = row_number()) %>%
  spread(columns, dt) %>% 
  select(-V1) %>%
  summarise_at(vars(Admissions:Tri_5),list(~ coalesce(!!! .))) # %>%
  # filter if needed
  #filter_at(vars(Admissions:Tri_5), all_vars(!is.na(.)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...