Замяна на NA в зависимост от типа разпределение на пола в R

Когато избрах NA стойност тук

data[data=="na"] <- NA
data[!complete.cases(data),]

трябва да го сменя, но в зависимост от вида на разпространението. Ако използвате Shapiro.test, разпределението по променливи не е нормално, тогава липсващата стойност трябва да се замени с медиана, ако е нормално, тогава да се замени със средна стойност. Но разпределение за всеки пол (1 момиче, 2 мъже)

data=structure(list(sex = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), emotion = c(20L, 
15L, 49L, NA, 34L, 35L, 54L, 45L), IQ = c(101L, 98L, 105L, NA, 
123L, 120L, 115L, NA)), .Names = c("sex", "emotion", "IQ"), class = "data.frame", row.names = c(NA, 
-8L))

желаната продукция

sex emotion IQ
1   20  101
1   15  98
1   49  105
1   28  101
2   34  123
2   35  120
2   54  115
2   45  119

person varimax    schedule 13.07.2018    source източник


Отговори (1)


Следният код ще замени стойностите на NA според теста на Шапиро:

library(dplyr)

data %>% 
 group_by(sex) %>%
 mutate(
  emotion = ifelse(!is.na(emotion), emotion,
   ifelse(shapiro.test(emotion)$p.value > 0.05,
    mean(emotion, na.rm=TRUE), quantile(emotion, na.rm=TRUE, probs=0.5) ) ),
  IQ = ifelse(!is.na(IQ), IQ,
   ifelse(shapiro.test(IQ)$p.value > 0.05,
    mean(IQ, na.rm=TRUE), quantile(IQ, na.rm=TRUE, probs=0.5) )
  )
 ) 
person Lstat    schedule 13.07.2018