Как опустить na в агрегате, чтобы вычислить SD в R

#r

#r

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом:

 dat <- structure(list(cohort = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "ADC8_AA", class = "factor"), 
    status = c(1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 
    1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, -9L, 1L, 1L, 2L, 
    2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 
    2L, 2L, 1L, 2L, -9L, 2L, 1L, -9L, 2L), age_onset = c(NA, 
    NA, NA, NA, 63, NA, 79, NA, 67, 71, 81, NA, NA, NA, NA, 73, 
    NA, 66, 77, 68, 75, NA, NA, NA, NA, 76, 79, NA, NA, NA, NA, 
    NA, 70, NA, 77, 84, 78, 76, NA, 92, 64, 60, 72, NA, 81, NA, 
    62, NA, 82, 74)), row.names = c(NA, 50L), class = "data.frame")
  

Я пытаюсь получить среднее значение и sd таким образом, но это дает мне NA для SD status ==-9 . В чем может быть причина и как мне сделать это правильно?

 > aggregate(age_onset~cohort status, data = dat, mean, na.action = na.omit)
   cohort status age_onset
1 ADC8_AA     -9  82.00000
2 ADC8_AA      2  73.54167
> aggregate(age_onset~cohort status, data = dat, sd)
   cohort status age_onset
1 ADC8_AA     -9        NA
2 ADC8_AA      2  7.661191
  

Ответ №1:

Попробуйте это:

 aggregate(age_onset~cohort status, data = dat, sd, na.rm = TRUE)
#    cohort status age_onset
# 1 ADC8_AA     -9        NA
# 2 ADC8_AA      2  7.661191
  

Вы можете использовать ... аргумент aggregate для перехода na.rm = TRUE к sd .

Вы все равно получите NA для любых групп, которые имеют только одно не пропущенное значение. Это связано с тем, что стандартное отклонение не определено для одного значения.

 subset(dat, status == -9)
#     cohort status age_onset
# 23 ADC8_AA     -9        NA
# 46 ADC8_AA     -9        NA
# 49 ADC8_AA     -9        82

sd(82)
# [1] NA
  

Комментарии:

1. Я все еще получаю NA.

2. Это потому, что существует только одно не пропущенное значение. Смотрите правки.

3. Opps. Это имеет смысл.

Ответ №2:

Мы можем использовать dplyr

 library(dplyr)
dat %>% 
    group_by(cohort, status) %>%
   summarise(Mean = mean(age_onset, na.rm = TRUE), 
             SD = sd(age_onset, na.rm = TRUE))