无需迭代即可汇总多个变量
考虑到这data需要summary措施mean和sd多个变量,
# Create grouping var; ####
mtcars <- mtcars %>% mutate(
am = case_when(
am == 0 ~ "Automatic",
TRUE ~ "Manual"
)
)
使用以下自定义function和purrr,我可以创建一个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)