Использование summarize_all с функциями, которые требуют и не требуют аргумента na.rm = T

Наблюдения в моих данных содержатся в группах, и я пытаюсь получить несколько сводных статистических данных (например, среднее значение, медиана, длина, стандартное отклонение) для каждой группы с помощью функции summarize_all.

Проблема в том, что некоторые функции (например, mean, median) требуют аргумента na.rm = T, а другие нет (например, n ()). Когда я указываю na.rm = T в summarize_all, он применяет аргумент na.rm к каждой перечисленной функции (ниже, mean и sd).

library(dplyr)

airquality %>% 
  select(Month, Ozone, Solar.R, Temp) %>%
  group_by(Month) %>%
  summarize_all(list(mean, sd), na.rm=T)

НО, когда он также применяет его к n (), когда я включаю эту функцию, что дает мне ошибку: «Ошибка: ошибка оценки: неиспользованные аргументы (Ozone, na.rm = TRUE)»

airquality %>% 
  select(Month, Ozone, Solar.R, Temp) %>%
  group_by(Month) %>%
  summarize_all(list(mean, sd, n), na.rm=T)

Я также хотел бы знать, как избавиться от ужасных имен столбцов, которые summarize_all создает при использовании более чем одной функции. Например, в первом фрагменте кода я получаю имена столбцов типа mpg_<S4: standardGeneric> и cyl_<S4: standardGeneric>.


person Brian Guay    schedule 06.08.2019    source источник
comment
Вы уверены, что проблема в na.rm? если вы вытащите na.rm, вы все равно получите ошибку озона. Я думаю, проблема в том, что mean и sd принимают входные аргументы, тогда как n () не имеет входных данных.   -  person Jacqueline Nolis    schedule 07.08.2019


Ответы (1)


Как я уже упоминал в комментариях к вашему вопросу, я думаю, что n() вызывает отдельную проблему: он ожидает 0 входов в функцию, поэтому я не думаю, что вы можете использовать его в summarize_all. Ради аргумента о na.rm предположим, что вы хотели знать о length

airquality %>% 
  select(Month, Ozone, Solar.R, Temp) %>%
  group_by(Month) %>%
  summarize_all(list(mean,sd,length),na.rm=T)

Ошибка в .Primitive ("length") (Ozone, na.rm = TRUE): 2 аргумента переданы в 'length', который требует 1

Одно из решений - вручную указать каждую из функций, которые вы хотите иметь na.rm = T, и сделать их анонимными:

airquality %>% 
  select(Month, Ozone, Solar.R, Temp) %>%
  group_by(Month) %>%
  summarize_all(list(mean = function(x) mean(x,na.rm=T), sd = function(x) sd(x,na.rm=T), length=length))

Также обратите внимание, что имя элемента в списке меняет то, как оно отображается во фрейме данных, когда вы закончите. Допустим, мы хотим, чтобы первый назывался "крутым":

airquality %>% 
  select(Month, Ozone, Solar.R, Temp) %>%
  group_by(Month) %>%
  summarize_all(list(cool = function(x) mean(x,na.rm=T), sd = function(x) sd(x,na.rm=T), length=length))
# A tibble: 5 x 10
  Month Ozone_cool Solar.R_cool Temp_cool Ozone_sd Solar.R_sd Temp_sd Ozone_length Solar.R_length Temp_length
  <int>      <dbl>        <dbl>     <dbl>    <dbl>      <dbl>   <dbl>        <int>          <int>       <int>
1     5       23.6         181.      65.5     22.2      115.     6.85           31             31          31
2     6       29.4         190.      79.1     18.2       92.9    6.60           30             30          30
3     7       59.1         216.      83.9     31.6       80.6    4.32           31             31          31
4     8       60.0         172.      84.0     39.7       76.8    6.59           31             31          31
5     9       31.4         167.      76.9     24.1       79.1    8.36           30             30          30
person Jacqueline Nolis    schedule 06.08.2019
comment
Большое спасибо! Да, я заметил то же самое, когда использовал length () вместо n (), поэтому решил, что проблема связана с аргументом na.rm. Спасибо! - person Brian Guay; 07.08.2019