R中的聚集函数以匹配字符串中的模式

R中的聚集函数以匹配字符串中的模式,r,function,subset,tidyr,R,Function,Subset,Tidyr,我想把宽桌子改成长桌子。我要收集的列有一个模式。现在,我只能根据他们的位置来收集他们。如何更改此选项以按列名中的模式收集它们?请仅使用收集功能 我已经包括了一个示例数据集,但是在真实数据集中有更多的列。因此,我想收集以下所有专栏: 以f或m 后跟一个或两个数字 dput(头部(测试1,1)) 结构(列表(startdate=“2019-11-06”,id=“POL55”,m0_9=NA_real), m10_19=NA_real_,m20_29=NA_real,m30_39=NA_real, m

我想把宽桌子改成长桌子。我要收集的列有一个模式。现在,我只能根据他们的位置来收集他们。如何更改此选项以按列名中的模式收集它们?请仅使用收集功能

我已经包括了一个示例数据集,但是在真实数据集中有更多的列。因此,我想收集以下所有专栏:

  • f
    m
  • 后跟一个或两个数字

    dput(头部(测试1,1)) 结构(列表(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,f50_59=NA_real,f60_69=NA_real, f70=NA_real_),row.names=c(NA,-1L),class=c(“待定”, “tbl”、“data.frame”))

    df_年龄2% 聚集(年龄、类别、计数、m0\U 9:f70) df_年龄2

  • 预期输出(将有更多未收集的列)。
    计数
    当然应该计数

     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
    
    startdate id age\u cat count
    2019-11-06波兰55 m0_9 NA
    2019-11-06波兰56 M09NA
    3 2019-11-06波兰57 m0_9 NA
    4 2019-11-06波尔58 m0_9 NA
    5 2019-11-06 POL59 m0_9 NA
    2019年11月6日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
    
    使用
    以开始:

    test1 %>% 
      gather(age_bucket, count, c(starts_with("m"), starts_with("f")))
    

    使用
    开始时使用

    test1 %>% 
      gather(age_bucket, count, c(starts_with("m"), starts_with("f")))
    

    我们可以从
    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%>%
    枢轴长度(cols=-c(起始日期,id),
    names_to=c('.value','grp'),names_pattern=“^([a-z])(.*)”
    #一个tibble:8x5
    #起始日期id grp m f
    #           
    #2019年11月6日波兰
    #2019年11月6日波兰
    #2019年11月6日波兰
    #2019年11月6日波兰
    #5 2019-11-06波兰
    #2019年11月6日波兰
    #7 2019-11-06 POL55 60_69 NA
    #8 2019-11-06波兰55 70 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%>%
    枢轴长度(cols=-c(起始日期,id),
    names_to=c('grp','.value'),names_pattern=“^([a-z])(.*)”
    #一个tibble:2x11
    #起始日期id grp`0\u 9``10\u 19``20\u 29``30\u 39``40\u 49``50\u 59``60\u 69``70`
    #                             
    #2019年11月06日POL55米NA NA 32 NA NA NA NA
    #2019年11月06日POL55 f 32不适用
    

    也可能是这样

    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
    
    test1%>%
    pivot_longer(cols=matches(“^(f|m)\\d+\u?\\d*$”),name_to='age_bucket',
    值(到='count')
    #一个tibble:16 x 4
    #起始日期id年限\桶计数
    #                
    #2019-11-06波兰55 m0_9 NA
    #2019年11月6日POL55 m10_19 NA
    #2019年11月6日POL55 m20_29 NA
    #4 2019-11-06 POL55 m30_39 NA
    #5 2019-11-06 POL55 M404932
    #6 2019-11-06 POL55 M5059NA
    #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波兰55 F1019NA
    #11 2019-11-06 POL55 f20_29 NA
    #12 2019-11-06 POL55 f30_39 NA
    #13 2019-11-06波兰55 F4049NA
    #14 2019-11-06波兰55 f50
    #15 2019-11-06 POL55 f60_69 NA
    #16 2019-11-06 POL55 f70北美
    
    我们可以从
    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%>%
    枢轴长度(cols=-c(起始日期,id),
    names_to=c('.value','grp'),names_pattern=“^([a-z])(.*)”
    #一个tibble:8x5
    #起始日期id grp m f
    #           
    #2019年11月6日波兰
    #2019年11月6日波兰
    #2019年11月6日波兰
    #2019年11月6日波兰
    #5 2019-11-06波兰
    #2019年11月6日波兰
    #7 2019-11-06 POL55 60_69 NA
    #8 2019-11-06波兰55 70 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%>%
    枢轴长度(cols=-c(起始日期,id),
    names_to=c('grp','.value'),names_pattern=“^([a-z])(.*)”
    #一个tibble:2x11
    #起始日期id grp`0\u 9``10\u 19``20\u 29``30\u 39``40\u 49``50\u 59``60\u 69``70`
    #                             
    #2019年11月06日POL55米NA NA 32 NA NA NA NA
    #2019年11月06日POL55 f 32不适用
    

    也可能是这样

    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
    
    test1%>%
    pivot_longer(cols=matches(“^(f|m)\\d+\u?\\d*$”),name_to='age_bucket',
    值(到='count')
    #一个tibble:16 x 4
    #起始日期id年限\桶计数
    #                
    #2019-11-06波兰55 m0_9 NA
    #2019年11月6日POL55 m10_19 NA
    #2019年11月6日POL55 m20_29 NA
    #4 2019-11-06 POL55 m30_39 NA
    #5 2019-11-06 POL55 M404932
    #6 2019-11-06 POL55 M5059NA
    #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波兰55 F1019NA
    #11 2019-11-06 POL55 f20_29 NA
    #12 2019-11-06 POL55 f30_39 NA
    #13 2019-11-06波兰55 F4049NA
    #14 2019-11-06波兰55 f50
    #15 2019-11-06 POL55 f60_69 NA
    #16 2019-11-06 POL55 f70北美
    
    这完全是基于列名以f或m开头的匹配,对吗?@Danka最后一个选项“是”,正如我在问题中提到的,我将有更多的列,我不想我匹配,其中一些将以m或开始f@Danka根据您的示例,不清楚预期输出是什么,即您的描述是以f或m开头,以避免非特定的mat