Функция сбора в R, чтобы соответствовать шаблонам в символьных строках - PullRequest
1 голос
/ 11 марта 2020

Я хочу собрать видоизмененный широкий стол на длинный стол. Столбцы, которые я хочу собрать, имеют шаблон. Пока мне удалось собрать их только по их положению. Как я могу изменить это, чтобы собрать их по шаблонам в именах столбцов? пожалуйста, используйте только функцию сбора.

Я включил пример набора данных, однако в реальном наборе данных есть еще много столбцов. Поэтому я хотел бы собрать все столбцы, которые:

  1. начинаются с f или m
  2. , за которыми следует один ИЛИ два структура чисел

    dput (head (test1, 1)) (list (startdate = "2019-11-06", id = "POL55", m0_9 = NA_real_, m10_19 = NA_real_, m20_29 = NA_real_, m30_39 = NA_real_, m40_49 = 32, m50_59 = NA_real_, m60_69 = NA_real_, m70 = NA_real_, f0_9 = 32, f10_19 = NA_real_, f20_29 = NA_real_, f30_39 = NA_real_, f40_49 = NA_real_, NA_real_ NA_real_70_70_70_70_70_70_70_70_70_70 , row.names = c (NA, -1L), класс = c ("tbl_df", "tbl", "data.frame"))

    df_age2 <- test1%>% собираются (age_cat, count, m0_9: f70) df_age2

ожидаемый результат (будет еще много столбцов, которые не собраны). count должен, конечно, рассчитывать ...

 startdate  id    age_cat count
   <chr>      <chr> <chr>      <dbl>
 1 2019-11-06 POL55 m0_9          NA
 2 2019-11-06 POL56 m0_9          NA
 3 2019-11-06 POL57 m0_9          NA
 4 2019-11-06 POL58 m0_9          NA
 5 2019-11-06 POL59 m0_9          NA
 6 2019-11-06 POL60 m0_9          NA
 7 2019-11-06 POL61 m0_9          NA
 8 2019-11-06 POL62 m0_9          NA
 9 2019-11-06 POL63 m0_9          NA
10 2019-11-06 POL64 m0_9          NA

Ответы [ 2 ]

3 голосов
/ 11 марта 2020

Мы можем использовать pivot_longer из tidyr

 library(dplyr)
 library(tidyr)
 test1 %>% 
    pivot_longer(cols = -c(startdate, id), names_to = c('.value', 'grp'), names_sep="_")

Или это может быть

test1 %>% 
  pivot_longer(cols = -c(startdate, id),
      names_to = c( '.value', 'grp'), names_pattern = "^([a-z])(.*)")
# A tibble: 8 x 5
#  startdate  id    grp       m     f
#  <chr>      <chr> <chr> <dbl> <dbl>
#1 2019-11-06 POL55 0_9      NA    32
#2 2019-11-06 POL55 10_19    NA    NA
#3 2019-11-06 POL55 20_29    NA    NA
#4 2019-11-06 POL55 30_39    NA    NA
#5 2019-11-06 POL55 40_49    32    NA
#6 2019-11-06 POL55 50_59    NA    NA
#7 2019-11-06 POL55 60_69    NA    NA
#8 2019-11-06 POL55 70       NA    NA

Или может быть

test1 %>% 
  pivot_longer(cols = -c(startdate, id), 
     names_to = c( 'grp',  '.value'), names_pattern = "^([a-z])(.*)")
# A tibble: 2 x 11
#   startdate  id    grp   `0_9` `10_19` `20_29` `30_39` `40_49` `50_59` `60_69`  `70`
#  <chr>      <chr> <chr> <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl> <dbl>
#1 2019-11-06 POL55 m        NA      NA      NA      NA      32      NA      NA    NA
#2 2019-11-06 POL55 f        32      NA      NA      NA      NA      NA      NA    NA

Или это может быть

test1 %>% 
  pivot_longer(cols = matches("^(f|m)\\d+_?\\d*$"), names_to = 'age_bucket',
        values_to = 'count')
# A tibble: 16 x 4
#   startdate  id    age_bucket count
#   <chr>      <chr> <chr>      <dbl>
# 1 2019-11-06 POL55 m0_9          NA
# 2 2019-11-06 POL55 m10_19        NA
# 3 2019-11-06 POL55 m20_29        NA
# 4 2019-11-06 POL55 m30_39        NA
# 5 2019-11-06 POL55 m40_49        32
# 6 2019-11-06 POL55 m50_59        NA
# 7 2019-11-06 POL55 m60_69        NA
# 8 2019-11-06 POL55 m70           NA
# 9 2019-11-06 POL55 f0_9          32
#10 2019-11-06 POL55 f10_19        NA
#11 2019-11-06 POL55 f20_29        NA
#12 2019-11-06 POL55 f30_39        NA
#13 2019-11-06 POL55 f40_49        NA
#14 2019-11-06 POL55 f50_59        NA
#15 2019-11-06 POL55 f60_69        NA
#16 2019-11-06 POL55 f70           NA
3 голосов
/ 11 марта 2020

Использование starts_with:

test1 %>% 
  gather(age_bucket, count, c(starts_with("m"), starts_with("f")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...