重新格式化dplyr summarise_at()输出

时间:2019-03-17 16:43:05

标签: r dplyr

我正在使用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的新手,如果这太基础了,请抱歉。

2 个答案:

答案 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)

在这种情况下,首先选择感兴趣的变量。其次,它执行从宽格式到长格式的转换,不包括“条件”列。第三,它按条件和变量名称分组并计算度量。在第四步中,它执行第二个从宽到长的转换,不包括“条件”列和带有初始变量名的列。最后,它将度量标准(大写)和条件结合在一起,删除冗余变量,并将其返回为所需格式。