代码之家  ›  专栏  ›  技术社区  ›  spore234

dplyr按字符串分组匹配

  •  1
  • spore234  · 技术社区  · 6 年前

    df <- data.frame(v1 = c('jan1', 'jan2', 'jan3', 'jan4', 'feb1', 'feb2', 'mar1', 'mar2', 'mar3'),
                 v2 = rnorm(9))
    

    我想在对数据进行分组后对它们进行总结。我要把它们按数字分组 v1 ,即一组为(1月1日、2月1日、3月1日),另一组为(1月2日、2月2日、3月2日),依此类推。

    我试过了,但没用:

    df %>% group_by(str_detect(v1, '1')) %>% summarise(meanp = mean(v2),
                                     medianp = median(v2))
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   markus    6 年前

    我们能做到

    library(dplyr)
    df %>% 
      group_by(grp = gsub("\\D", "", v1)) %>% 
      summarise(mean_v2 = mean(v2)) # only for illustration
    # A tibble: 4 x 2
    #  grp   mean_v2
    #  <chr>   <dbl>
    #1 1      0.0635
    #2 2      0.0338
    #3 3     -0.130 
    #4 4      1.60
    

    这个 group_by gsub v1 ,请参见 ?regex .

    set.seed(1)
    df <- data.frame(v1 = c('jan1', 'jan2', 'jan3', 'jan4', 'feb1', 'feb2', 'mar1', 'mar2', 'mar3'),
                     v2 = rnorm(9))
    
        2
  •  1
  •   akrun    6 年前

    str_remove

    library(tidyverse)
    df %>% 
      group_by(grp = str_remove(v1, "\\D+")) %>% 
      summarise(mean_v2 = mean(v2))
    # A tibble: 4 x 2
    #  grp   mean_v2
    #  <chr>   <dbl>
    #1 1      0.0635
    #2 2      0.0338
    #3 3     -0.130 
    #4 4      1.60