提问人:Sam 提问时间:9/30/2020 更新时间:10/1/2020 访问量:595
将 dplyr summarise() 用于 purrr map() 中的特定列,并带有分组数据
Using dplyr summarise() for specific columns within purrr map() with grouped data
问:
我有一个问题要解决,但我似乎找不到一个简洁的解决方案。关于 SO 有一些类似的问题,但没有一个完全适合。
以一些示例数据为例:
library(dplyr)
dat <- tibble(
group1 = factor(sample(c("one", "two"), 10, replace = T)),
group2 = factor(sample(c("alpha", "beta"), 10, replace = T)),
var1 = rnorm(10, 20, 2),
var2 = rnorm(10, 20, 2),
var3 = rnorm(10, 20, 2),
other1 = sample(c("a", "b", "c"), 10, replace = T),
other2 = sample(c("a", "b", "c"), 10, replace = T),
)
我只想总结数值变量(即忽略 和 ),但将输出按 和 分组。other1
other2
group1
group2
我尝试过这样的事情,但它在尝试将我的函数应用于分组变量时返回错误。summarise()
dat %>%
group_by(group1, group2) %>%
select(where(is.numeric)) %>%
map(~ .x %>%
filter(!is.na(.x)) %>%
summarise(mean = mean(.x),
sd = sd(.x),
median = median(.x),
q1 = quantile(.x, p = .25),
q3 = quantile(.x, p = .75))
)
我的预期输出是这样的
group1 group2 mean sd median q1 q3
<fct> <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
1 one alpha ? ? ? ? ?
2 one beta ? ? ? ? ?
3 two alpha ? ? ? ? ?
4 two beta ? ? ? ? ?
任何解决方案将不胜感激。
谢谢 山 姆
答:
3赞
Waldi
9/30/2020
#1
尝试:
dat %>% group_by(group1,group2) %>%
summarize(across(is.numeric,c(sd = sd,
mean = mean,
median =median,
q1 = function(x) quantile(x,.25),
q3 = function(x) quantile(x,.75))))
group1 group2 var1_sd var1_mean var1_median var1_q1 var1_q3 var2_sd var2_mean var2_median var2_q1 var2_q3 var3_sd
<fct> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 one alpha 4.06 20.6 19.3 18.3 22.2 1.12 17.9 17.3 17.2 18.2 1.09
2 one beta 0.726 18.7 18.7 18.4 18.9 0.348 18.8 18.8 18.7 18.9 0.604
3 two alpha 1.31 19.9 20.0 19.3 20.6 1.10 17.8 18.3 17.4 18.5 0.624
4 two beta 0.777 21.2 21.2 21.0 21.5 1.13 19.6 19.6 19.2 20.0 0.0161
评论
0赞
Sam
10/1/2020
太棒了,谢谢@Waldi。看起来我只是把事情弄得太复杂了,我仍然习惯于合并新功能和一般的整洁宇宙。您知道是否有办法向内部的所有函数提供,或者我需要在每次调用中指定它吗?across()
na.rm = T
summarise()
0赞
Waldi
10/1/2020
@Sam,很高兴我能帮上忙。您应该能够提供额外的参数,请参阅 tidyverse.org/blog/2020/04/dplyr-1-0-0-colwisena.rm = T
1赞
ciakovx
10/1/2020
#2
您还可以将列传递给以下函数:summarise
dat %>%
group_by(group1, group2) %>%
summarise(mean = mean(var1:var3),
sd = sd(var1:var3),
median = median(var1:var3),
q1 = quantile(var1:var3, p = .25),
q3 = quantile(var1:var3, p = .75))
dat
# A tibble: 4 x 7
# Groups: group1 [2]
# group1 group2 mean sd median q1 q3
# <fct> <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 one alpha 19.1 0.707 19.1 18.8 19.3
# 2 one beta 17.5 1.29 17.5 16.8 18.3
# 3 two alpha 17.1 NA 17.1 17.1 17.1
# 4 two beta 19.9 NA 19.9 19.9 19.9
评论
0赞
Sam
10/1/2020
知道这一点真的很有用。我更喜欢 Waldi 的答案,因为我不需要经常指定变量名称,但我没有想过用它来选择多个变量,我忘记了这是一个整洁的概念。:
评论
group_by(group1, group2)
summarise_at
summarise_if
summarise
across