0
votes

Comment remplacer efficacement les gammes avec leur médiane dans un fichier de données

Supposons que j'ai un dataframe nommé score.master code> qui ressemble à ceci:

score.master$perc.prof[score.master$perc.prof == "6-9"] <- round(median(6:9), 0)


3 commentaires

La deuxième partie de votre question sur l'impression de données est une question de la méthode des statistiques, donc il est hors tension sur un bon sens pour croix validée . Peut-être supprimer cette partie de ce poste d'ici et poster comme sa propre question sur CV


Fait, merci pour la recommandation.


Comment envisagez-vous de marquer quels groupes à imputer? Dans cet exemple, vous vous attendriez à avoir des valeurs imputées pour tous sauf l'école A? Et puis que vous attendez-vous à avoir pour l'école d?


3 Réponses :


1
votes

Voici une approche obligatoire. D'abord, je remplace "GE50" avec sa sortie attendue, puis utilisez titsyr :: séparez code> pour diviser PERC.Prof dans la mesure du possible. La dernière étape utilise le PERC.Profe donné si une grande école ou utilise la médiane des petites écoles.

library(tidyverse)
df %>%
  mutate(perc.prof = if_else(perc.prof == "GE50", "75", perc.prof)) %>%
  separate(perc.prof, c("low", "high"), remove = F, convert = T) %>% 
  mutate(perc.prof.adj = if_else(num.tested > 100, 
                                 as.numeric(perc.prof),
                                 rowSums(select(., low, high), na.rm = T)/2)
  )

  school perc.prof low high num.tested perc.prof.adj
1      A         8   8   NA        482           8.0
2      B       6-9   6    9         34           7.5
3      C     40-49  40   49         49          44.5
4      D        75  75   NA         81          37.5
5      E     80-89  80   89         26          84.5


0 commentaires

1
votes

Vous pouvez faire ce qui suit pour convertir vos gammes avec la médiane. Cependant, je n'ai pas géré les situations "Gexx" ou "Lexx" car ce n'est pas assez défini.

Notez que vous auriez besoin du package stringr code> pour ma solution. P>

score.master$perc.prof <- sapply(score.master$perc.prof, function(x){
  sep <- stringr::str_locate(x, "-")[, 1]
  if(is.na(sep)) {
    x
  } else {
    as.character(round(median(as.integer(stringr::str_sub(x, c(1L, sep+1), c(sep-1, -1L))))))
  }
})


0 commentaires

3
votes

Vous pouvez utiliser stringr :: str_split () pour obtenir la limite inférieure et supérieure, puis calculez la médiane. Le "GE50" et similaires ne sont pas généralisables à cela, et vous pourriez utiliser Ifelse () pour gérer des cas spéciaux. xxx


0 commentaires