我正在使用summarise_at()
来按组获取多个变量的均值和标准误。
每个组的输出有1行,每个计算的数量有1列。我想要一个表,每个变量有1行,每个计算量有1列:
data <- mtcars
data$condition <- as.factor(c(rep("control", 16), rep("treat", 16)))
data %>%
group_by(condition) %>%
summarise_at(vars(mpg, cyl, wt),
funs(mean = mean, se=sd(.)/sqrt(n())))
# A tibble: 2 x 7
condition mpg_mean cyl_mean wt_mean mpg_se cyl_se wt_se
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 control 18.2 6.5 3.56 1.04 0.387 0.204
2 treat 22.0 5.88 2.87 1.77 0.499 0.257
这是我认为更有用的(数字没有意义):
# MEAN.control, MEAN.treat, SE.control, SE.treat
# mpg 1.5 2.4 .30 .45
# cyl 3.2 1.9 .20 .60
# disp 12.3 17.8 .20 .19
有什么想法吗? tidyverse
的新手,如果这太基础了,请抱歉。
答案 0 :(得分:3)
funs
中的dplyr
已过时。而是在list
中使用summarise_at/mutate_at
。在summarise
步骤之后,gather
将数据转换为'long'格式,通过在定界符separate
,然后在{{1} }'cond'和'key2'(更改了'key2'的大小写之后),_
将其更改为'wide'格式,如果需要,请更改列'key1'的行名
unite
答案 1 :(得分:1)
另一种可能是:
data %>%
group_by(condition) %>%
summarise_at(vars(mpg, cyl, wt), list(mean = ~ mean(.),
se = ~ sd(.)/sqrt(n()))) %>%
gather(var, val, -condition) %>%
separate(var, c("vars", "var2")) %>%
mutate(var2 = paste(toupper(var2), as.character(condition), sep = "_")) %>%
select(-condition) %>%
spread(var2, val)
vars MEAN_control MEAN_treat SE_control SE_treat
<chr> <dbl> <dbl> <dbl> <dbl>
1 cyl 6.5 5.88 0.387 0.499
2 mpg 18.2 22.0 1.04 1.77
3 wt 3.56 2.87 0.204 0.257
在这里,在您完成初始步骤之后,它将执行从宽到长的数据转换,但不包括“条件”列。其次,它将变量名称分为两列。第三,它结合了度量和条件,度量是大写的。最后,它将删除冗余变量,并将其返回为所需的格式。
或者您可以通过使用一些正则表达式来避免separate()
:
data %>%
group_by(condition) %>%
summarise_at(vars(mpg, cyl, wt), list(mean = ~ mean(.),
se = ~ sd(.)/sqrt(n()))) %>%
gather(var, val, -condition) %>%
mutate(vars = gsub("_.*$", "", var),
var2 = gsub(".*\\_", "", var)) %>%
mutate(var2 = paste(toupper(var2), as.character(condition), sep = "_")) %>%
select(-condition, -var) %>%
spread(var2, val)
或使用strsplit()
:
data %>%
group_by(condition) %>%
summarise_at(vars(mpg, cyl, wt), list(mean = ~ mean(.),
se = ~ sd(.)/sqrt(n()))) %>%
gather(var, val, -condition) %>%
mutate(vars = sapply(strsplit(var, "_"), function(x) x[1]),
var2 = sapply(strsplit(var, "_"), function(x) x[2])) %>%
mutate(var2 = paste(toupper(var2), as.character(condition), sep = "_")) %>%
select(-condition, -var) %>%
spread(var2, val)
或者您可以将其完全重写为:
data %>%
select(mpg, cyl, wt, condition) %>%
gather(vars, val, -condition) %>%
group_by(condition, vars) %>%
summarise(mean = mean(val),
se = sd(val)/sqrt(n())) %>%
ungroup() %>%
gather(var2, val, -c(condition, vars)) %>%
mutate(var2 = paste(toupper(var2), condition, sep = "_")) %>%
select(-condition) %>%
spread(var2, val)
在这种情况下,首先选择感兴趣的变量。其次,它执行从宽格式到长格式的转换,不包括“条件”列。第三,它按条件和变量名称分组并计算度量。在第四步中,它执行第二个从宽到长的转换,不包括“条件”列和带有初始变量名的列。最后,它将度量标准(大写)和条件结合在一起,删除冗余变量,并将其返回为所需格式。