我在R工作.

我有一所学校教职员工的一些数据:

data <- data.frame(person_id = c(1, 2, 3, 4, 5, 6, 7, 8), 
                   disability_status = c("yes", "no", "yes", "no", "yes", "no", "yes", "no"),
                   age_group = c("20-30","30-40","20-30","30-40","20-30","30-40","20-30","30-40"), 
                   teacher = c("yes", "no", "no", "yes", "no","yes", "no", "yes" ))

我已经编写了一个函数,它可以在插入的变量中创建求和."group_tag"参数是为了帮助以后在我的代码中进行调试.

group_the_data <- function(data, 
                           variable, 
                           group_tag) {
  
  grouped_output <- data %>%
                    mutate(flag = 1) %>%
                    group_by({{variable}}) %>%
                    summarise(number_staff = sum(flag, na.rm = T)) %>%
                    mutate(grouping_tag := {{group_tag}})
  
  return(grouped_output)
  
}

然后,我使用该函数依次按残障状态、年龄组和教师分组:

disability_grouped <- group_the_data(data = data,
                                     variable = disability_status,
                                     group_tag = "disability status")

age_group_grouped <- group_the_data(data = data,
                                    variable = age_group,
                                    group_tag = "age group")

role_grouped <- group_the_data(data = data,
                               variable = teacher,
                               group_tag = "role")

一旦我有了我需要的数据帧,我就把它们绑定在一起:

all_data_grouped <- bind_rows(disability_grouped, age_group_grouped, role_grouped)

有没有一种方法可以遍历变量,这样我就不需要写出三次函数了?

或者使用Apply函数之一是不是更好的主意?

推荐答案

您可以使用lapplypurrr::map迭代您的变量.要做到这一点,我们需要遍历字符串而不是变量,所以您需要在group_by中对变量进行pick.

library(tidyverse)

group_the_data <- function(data, 
                           variable, 
                           group_tag) {
  
  grouped_output <- data %>%
    mutate(flag = 1) %>%
    group_by(pick(variable)) %>% # pick the variable
    summarise(number_staff = sum(flag, na.rm = T)) %>%
    mutate(grouping_tag := {{group_tag}})
  
  return(grouped_output)
  
}

purrr::map(colnames(data)[-1], 
           ~ group_the_data(data, variable = .x, group_tag = .x)) %>% 
  bind_rows()

# A tibble: 6 × 5
  disability_status number_staff grouping_tag      age_group teacher
  <chr>                    <dbl> <chr>             <chr>     <chr>  
1 no                           4 disability_status NA        NA     
2 yes                          4 disability_status NA        NA     
3 NA                           4 age_group         20-30     NA     
4 NA                           4 age_group         30-40     NA     
5 NA                           4 teacher           NA        no     
6 NA                           4 teacher           NA        yes 

同样,如果您想要有不同的"变量"和"group_tag",请使用purrr::map2:

purrr::map2(colnames(data)[-1], 
            c("disability status", "age group", "role"), 
            ~ group_the_data(data, variable = .x, group_tag = .y)) %>% 
  bind_rows()

# A tibble: 6 × 5
  disability_status number_staff grouping_tag      age_group teacher
  <chr>                    <dbl> <chr>             <chr>     <chr>  
1 no                           4 disability status NA        NA     
2 yes                          4 disability status NA        NA     
3 NA                           4 age group         20-30     NA     
4 NA                           4 age group         30-40     NA     
5 NA                           4 role              NA        no     
6 NA                           4 role              NA        yes   

R相关问答推荐

计算R中的威布尔分布的EDF

如何利用模型函数在格图中添加双曲/指数曲线

修改用R编写的用户定义函数

R for循环返回到先前值

如何在emmeans中计算连续变量的对比度

删除具有相同标题的tabPanel(shinly)

如何在一次运行中使用count进行多列计数

从多个线性回归模型中提取系数

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

将文本批注减少到gglot的y轴上的单个值

R将函数参数传递给ggploy

每行不同列上的行求和

如何在shiny 的应用程序 map 视图宣传单中可视化单点

在鼠标悬停时使用Plotly更改geom_point大小

了解nchar在列表上的意外行为

希望解析和复制R中特定模式的数据

如何捕获这个shiny 的、可扩展的react 性用户输入矩阵作为另一个react 性对象,以便进一步操作?

合并多个数据帧,同时将它们的名称保留为列名?

如何在一个GGPLATE中绘制多个灰度平滑?

如果缺少时间,如何向日期-时间列添加时间