У меня есть таблица с категориями и подкатегориями, закодированными в этом формате имени столбца:
Date| Admissions__0 |Attendance__0 |Tri_1__0|Tri_2__0|... Tri_1__1|Tri_2__1|...|
и я хотел бы изменить его на этот формат столбцов используя функцию распространения и сбора tidyverse:
Date| Country code| Admissions| Attendance| 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 ... ... ... ...
Я думаю, вам нужно temp %>% group_by(Date, country_code) %>% mutate(row = row_number()) %>%spread(key = "columns",value = "dt")
(не тестировалось, так как не было примера ввода)
@akrun спасибо. data.gov.au/dataset/ds-dga-6bfec5ea-207e-4d67-8965-c7e72290844b/… вот мой набор данных, над которым я работаю. Я попробовал ваше предложение, но оно по-прежнему возвращает те же результаты, что и раньше.
Я попытался загрузить данные. Я не получаю те же имена столбцов, что и ваши.
@akrun, я отредактировал свои столбцы до начальных столбцов набора данных, можете ли вы получить для меня чек? заранее спасибо!
@akrun вот файл csv: drive.google.com/open?id=1wKutidGfGdzOZ65d4lUqb88s1k54ayBk спасибо
Не ясно, нужно ли удалять НС и объединять вместе. В таком случае 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(!!! .)))
и для дальнейшего удаления всех строк NA %>% filter_at(vars(Admissions:Tri_5), all_vars(!is.na(.)))
@akrun проблема решена! большое спасибо!
Мы можем сделать 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(.)))
Можете ли вы показать небольшие воспроизводимые входные данные