【问题标题】:Better way to summarize percentages by subgroup using dplyr?使用 dplyr 按子组汇总百分比的更好方法?
【发布时间】:2017-11-27 16:29:29
【问题描述】:

在咨询了关于 SO,like here 的类似问题后,我终于得到了我想要的输出,但我不禁想知道是否有更好的方法可以到达那里。另外,我想知道是否有一种方法可以使用管道运算符链接最后一步,从而消除经理和标题组合的重复。

可重现的例子:

library(dplyr)

# Sample data frame
employee = LETTERS[1:18]
manager  = c(rep("Tom", 3), rep("Sue", 4), rep("Mike", 4), rep("Jack", 7))  
title    = c(rep("Entry", 2), rep("Mid", 3), rep("Junior", 7), rep("Senior", 6))

mydata <- data.frame(employee, manager, title)

# Code gives me output I want, but wondering if there is a better way
org2 <-  mydata %>%
  group_by(manager, title) %>%
  mutate(title_count = n()) %>%  # Total number of people with given title by manager
  ungroup() %>%
  group_by(manager) %>%          # Total number of people in manager's group
  mutate(mgr_total = n()) %>%
  group_by(title, add = TRUE) %>%
  mutate(title_pctg = round(title_count/mgr_total*100, 1)) %>%  # Percent of people with given title by manager
  select(-employee)

# Remove duplicates of manager and title to summarize data wanted
org2 <- org2[!duplicated(org2[2:4]), ]

arrange(org2, manager, title)

# A tibble: 7 x 5
# Groups:   manager, title [7]
#  manager  title title_count mgr_total title_pctg
#   <fctr> <fctr>       <int>     <int>      <dbl>
#1    Jack Junior           1         7       14.3
#2    Jack Senior           6         7       85.7
#3    Mike Junior           4         4      100.0
#4     Sue Junior           2         4       50.0
#5     Sue    Mid           2         4       50.0
#6     Tom  Entry           2         3       66.7
#7     Tom    Mid           1         3       33.3

提前感谢您的想法和帮助。

【问题讨论】:

    标签: r group-by dplyr


    【解决方案1】:

    您可以通过切换group_by 的顺序将其简化为以下内容(即先按manager 分组,然后按manger + title 分组,而不是其他方式);

    mydata %>% 
        group_by(manager) %>% 
        mutate(mgr_count = n()) %>% 
        group_by(title, mgr_count, add=TRUE) %>% 
        summarise(
            title_count = n(), 
            title_pctg = round(title_count / first(mgr_count) * 100, 1)
        )
    
    # A tibble: 7 x 5
    # Groups:   manager, title [?]
    #  manager  title mgr_count title_count title_pctg
    #   <fctr> <fctr>     <int>       <int>      <dbl>
    #1    Jack Junior         7           1       14.3
    #2    Jack Senior         7           6       85.7
    #3    Mike Junior         4           4      100.0
    #4     Sue Junior         4           2       50.0
    #5     Sue    Mid         4           2       50.0
    #6     Tom  Entry         3           2       66.7
    #7     Tom    Mid         3           1       33.3
    

    【讨论】:

    • 优秀。我不知道“第一”功能以及它在这里的方便程度。
    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多