【问题标题】:dplyr group by string matchdplyr 按字符串匹配分组
【发布时间】:2018-09-17 11:57:20
【问题描述】:

我有一个这样的数据框:

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

我想在分组后总结数据。我希望它们按v1 中的数字分组,即一组是(jan1,feb1,mar1),另一组是(jan2,feb2,mar2)等等。

我试过了,但它不起作用:

df %>% group_by(str_detect(v1, '1')) %>% summarise(meanp = mean(v2),
                                 medianp = median(v2))

【问题讨论】:

  • 您能否提供代表性样本数据。您声明您希望按 v1 分组,但在您提供的示例数据中 v1 只取一个值。我也不明白你想用group_by(str_detect(v1, '1')) 做什么。为什么不只是group_by(v1)

标签: r group-by dplyr


【解决方案1】:

我们可以的

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_bygsub 部分根据变量v1 的非字母字符创建分组变量,请参阅?regex

数据

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

【讨论】:

    【解决方案2】:

    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  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-06
      • 2017-04-02
      • 2018-01-24
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多