无需迭代即可汇总多个变量

考虑到这data需要summary措施meansd多个变量,

# Create grouping var; ####
mtcars <- mtcars %>% mutate(
        am = case_when(
                am == 0 ~ "Automatic",
                TRUE ~ "Manual"
        )
)

使用以下自定义functionpurrr,我可以创建一个baseline table

# Summarising function; ####
sum_foo <- function(data, var) {
        
        data %>% 
                group_by(am) %>% 
                summarise(
                        mean = mean( !!sym(var) , na.rm = TRUE),
                        sd   = sd( !!sym(var) , na.rm = TRUE)
                ) %>% 
                mutate(across(where(is.double), round, 2)) %>%  
                group_by(am) %>% 
                transmute(
                        value = paste(mean, "(±", sd, ")", sep = ""),
                        variable = var
                ) %>%
                pivot_wider(
                        names_from = "am"
                )
        
        
}


# Execute Function; ####
sum_variables <- c("mpg", "hp", "disp")


sum_variables %>% map(
        sum_foo,
        data = mtcars
) %>% reduce(
        bind_rows
)

这给出了以下内容output

# A tibble: 3 x 3
  variable Automatic       Manual        
  <chr>    <chr>           <chr>         
1 mpg      17.15(±3.83)    24.39(±6.17)  
2 hp       160.26(±53.91)  126.85(±84.06)
3 disp     290.38(±110.17) 143.53(±87.2) 

我想在output不使用map和的情况下获得reduce,即。不使用rowwise或迭代变量map

我正在寻找替代 tidyverse解决方案!

回答

也许你可以使用这个解决方案:

library(dplyr)
library(tidyr)
library(tibble)

sum_variables %>%
  enframe() %>%
  rowwise() %>%
  mutate(output = list(sum_foo(mtcars, value))) %>%
  select(output) %>%
  unnest(cols = output)

# A tibble: 3 x 3
  variable Automatic       Manual        
  <chr>    <chr>           <chr>         
1 mpg      17.15(±3.83)    24.39(±6.17)  
2 hp       160.26(±53.91)  126.85(±84.06)
3 disp     290.38(±110.17) 143.53(±87.2) 

更新
或者您甚至可以通过以下方式修改您的功能:

sum_foo2 <- function(data, var) {
  data %>% 
    group_by(am) %>% 
    summarise(across(all_of(var), list(Mean = mean, sd = sd))) %>% 
    mutate(across(where(is.double), round, 2)) %>%  
    group_by(am) %>%
    summarise(across(ends_with("Mean"), ~ paste(.x, "(±", get(gsub("_Mean", "_sd", cur_column())), ")", sep = ""))) %>%
    pivot_longer(!am, names_to = "Mean", values_to = "Val") %>%
    pivot_wider(names_from = "am", values_from = "Val")
}

sum_foo2(mtcars, sum_variables)

# A tibble: 3 x 3
  Mean      Automatic       Manual        
  <chr>     <chr>           <chr>         
1 mpg_Mean  17.15(±3.83)    24.39(±6.17)  
2 hp_Mean   160.26(±53.91)  126.85(±84.06)
3 disp_Mean 290.38(±110.17) 143.53(±87.2) 
 

如果我要将上面的函数修剪成更简洁的版本:

sum_foo2 <- function(data, var) {
  data %>%
    group_by(am) %>%
    summarise(across(all_of(var), ~ paste0(round(mean(.x), 2), "(±", round(sd(.x), 2), ")"))) %>%
    pivot_longer(!am, names_to = "Mean", values_to = "Val") %>%
    pivot_wider(names_from = "am", values_from = "Val")
}

sum_foo2(mtcars, sum_variables)

  • @Anoushiravan R:我的朋友,这对你来说一定很难,但你没有‘地图’就做到了!是的。:-)

回答

不使用您编写的需要迭代的函数,即 rowwise/map,您可以简单地执行以下操作:

sum_variables <- c("mpg", "hp", "disp")
mtcars %>%
  group_by(am) %>%
  summarise(across(all_of(sum_variables),
        ~sprintf('%.2f(u00B1%.2f)', mean(.x), sd(.x))), .groups = 'drop') %>%
  data.table::transpose(keep.names = 'variable', make.names = TRUE)

 variable       Automatic         Manual
1      mpg    17.15(±3.83)   24.39(±6.17)
2       hp  160.26(±53.91) 126.85(±84.06)
3     disp 290.38(±110.17) 143.53(±87.20)


以上是无需迭代即可汇总多个变量的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>