#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))