【问题标题】:reformatting dplyr summarise_at() output重新格式化 dplyr summarise_at() 输出
【发布时间】:2019-03-18 04:36:34
【问题描述】:

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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    funsdplyr 中被弃用。而是在summarise_at/mutate_at 中使用list。在summarise 步骤之后,gather 将数据转换为“long”格式,separate 将“key”列通过分隔符 _ 拆分为两列,然后将 unite“cond”和“key2”(更改'key2'的大小写后),spread它为'wide'格式,如果需要,使用列'key1'更改行名

    library(tidyverse)
    data %>% 
       group_by(condition) %>%
       summarise_at(vars(mpg, cyl, wt), list(MEAN = ~ mean(.), 
                                        SE = ~sd(.)/sqrt(n()))) %>% 
       gather(key, val, -condition) %>% 
       separate(key, into = c("key1", "key2")) %>%        
       unite(cond, key2, condition, sep=".") %>% 
       spread(cond, val) %>%
       column_to_rownames('key1')
    #    MEAN.control MEAN.treat SE.control  SE.treat
    #cyl     6.500000   5.875000  0.3872983 0.4989572
    #mpg    18.200000  21.981250  1.0369024 1.7720332
    #wt      3.560875   2.873625  0.2044885 0.2571034
    

    【讨论】:

    • 很好奇,为什么funs改成了list?!
    • @NelsonGon 我发现了一个未解决的问题here,但没有提到原因
    • 谢谢!!我也根据您的评论更新了示例。我很感激。
    • @BrianGuay 感谢您的更新。但是,我看到价值观不同。这是预期的输出吗
    【解决方案2】:

    另一种可能是:

    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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 2014-07-24
      • 2016-10-07
      • 2015-08-20
      相关资源
      最近更新 更多