【问题标题】:summarise dataset conditioning on variable using dplyr使用 dplyr 总结对变量的数据集调节
【发布时间】:2017-09-08 09:29:25
【问题描述】:

我想总结我的数据集,将变量 age 分组为 5 岁年龄组,因此我将使用 0 5 10 15 等而不是单一年龄 0 1 2 3 4 5 6... 等,80 是我的开放式类别。我可以通过手动对所有内容进行分类来创建一个新变量来做到这一点,但我相信一定有更快的方法!

a <- cbind(age=c(rep(seq(0, 90, by=1), 2)), value=rnorm(182))

有什么想法吗?

【问题讨论】:

  • 只需检查?cut,创建一个分组变量并总结即a %&gt;% group_by(grp = cut(age, breaks = c(-Inf,seq(0, 90, by = 5), Inf))) %&gt;% summarise(val = sum(value))
  • 我认为您正在寻找plyr::round_anycut
  • 获得 >= 80 组怎么样?

标签: r dplyr data-manipulation


【解决方案1】:

喜欢这个?

library(dplyr)
a %>% data.frame %>% group_by(age_group = (sapply(age,min,80) %/% 5)*5) %>%
 summarize(avg_val = mean(value))

# A tibble: 17 x 2
   age_group      avg_val
       <dbl>        <dbl>
 1         0 -0.151470805
 2         5  0.553619149
 3        10  0.198915973
 4        15 -0.436646287
 5        20 -0.024193193
 6        25  0.102671120
 7        30 -0.350059839
 8        35  0.010762264
 9        40  0.339268917
10        45 -0.056448481
11        50  0.002982158
12        55  0.348232262
13        60 -0.364050091
14        65  0.177551510
15        70 -0.178885909
16        75  0.664215782
17        80 -0.376929230

【讨论】:

    【解决方案2】:

    示例数据

    set.seed(1)
    df <- data.frame(age=runif(1000)*100,
                     value=runif(1000))
    

    只需将组的最大值添加到seq(0,80,5) 即可使用c(..., max(age)) 进行不定期休息

    library(dplyr)
    df %>%
      mutate(age = cut(age, breaks=c(seq(0,80,5), max(age)))) %>%
      group_by(age) %>%
      summarise(value=mean(value))
    

    输出

            age     value
         <fctr>     <dbl>
     1    (0,5] 0.4901119
     2   (5,10] 0.5131055
     3  (10,15] 0.5022297
     4  (15,20] 0.4712481
     5  (20,25] 0.5610872
     6  (25,30] 0.4207203
     7  (30,35] 0.5218318
     8  (35,40] 0.4377102
     9  (40,45] 0.5007616
    10  (45,50] 0.4941768
    11  (50,55] 0.5350272
    12  (55,60] 0.5226967
    13  (60,65] 0.5031688
    14  (65,70] 0.4652641
    15  (70,75] 0.5667020
    16  (75,80] 0.4664898
    17 (80,100] 0.4604779
    

    【讨论】:

    • 它适用于您的数据,但在我的可重现样本和我的数据中,它会产生一个额外的类别NA,即使我没有NA
    • 你需要转换成data.frame a &lt;- as.data.frame(a)
    • 我在运行它之前这样做了
    • 它似乎没有将0 识别为第一类
    • 你必须改用mutate(age = cut(age, breaks=c(-1, seq(5,80,5), max(age))))之类的东西
    猜你喜欢
    • 2018-03-03
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    相关资源
    最近更新 更多