переформатировать вывод dplyr summarise_at () - PullRequest
1 голос
/ 17 марта 2019

Я использую 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 ]

3 голосов
/ 17 марта 2019

funs устарела в dplyr.Вместо этого используйте list в summarise_at/mutate_at.После шага summarise, gather данные в «длинном» формате, separate столбец «key» на две части, разделив их разделителем _, затем unite «cond» и «key2» (изменив регистр «key2»), spread переведите его в «широкий» формат и, если необходимо, измените имена строк в столбце «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
1 голос
/ 17 марта 2019

Другая возможность может быть:

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)

В этом случае сначала выбираются интересующие переменные. Во-вторых, он выполняет преобразование из широкого в длинный формат, исключая столбец «условие». В-третьих, он группирует по условиям и именам переменных и вычисляет метрики. На четвертом шаге выполняется второе преобразование из широкой в ​​длинную, за исключением столбца «условие» и столбца с исходными именами переменных. Наконец, он объединяет метрику (верхний регистр) и условие, удаляет избыточную переменную и возвращает ее в нужный формат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...