2017-09-27 4 views
0

J'essaie d'imputer des valeurs manquantes en fonction d'un groupe. J'obtiens une erreur que la fonction median() nécessite des données numériques, mais toutes mes données sont numériques, donc je ne peux pas voir le problème. Voici un exemple minimalement reproductible.Médian remplacer, besoin de données numériques

set.seed(123) 
cluster = sample(seq(1,10),1000,replace=TRUE) 
V1 = sample(c(runif(100),NA),1000,replace=TRUE) 
V2 = sample(c(runif(100),NA),1000,replace=TRUE) 

df = as.data.frame(cbind(cluster,V1,V2)) 

df_fixed = by(df,df$cluster,function(x){replace(x,is.na(x),median(x, na.rm=TRUE))}) 

Erreur renvoyée:

erreur dans median.default (x, na.rm = TRUE): besoin de données numériques

Ce code fonctionne bien, de sorte que le problème est avec la fonction médiane.

df_fixed = by(df,df$cluster,function(x){replace(x,is.na(x),1)}) 
+0

s'il vous plaît utiliser 'set.seed' lorsque vous utilisez des fonctions telles que' runif', 'etc pour faire échantillon réduit, reproductible – Sotos

+2

' by' est df coupe en petits data.frames - qui ne sont pas classe numérique. Voulez-vous remplacer avec des médianes colonne-sage ou une médiane globale? –

+0

J'essaye de remplacer la médiane de colonne sage pour chacun par le groupe. Donc si dans le groupe 1 et manquant, remplacez avec la médiane du groupe 1. – user137698

Répondre

1
df_fixed <- apply(df[,2:3], 2, function(x) { 
    md <- sapply(sort(unique(df$cluster)), function(k) median(x[df$cluster==k], na.rm=TRUE)) 
    x[is.na(x)] <- md[df$cluster][is.na(x)] 
    return(x) 
}) 

any(is.na(df_fixed)) 
# [1] FALSE 
+0

Ce code fonctionne quand il y a des valeurs manquantes dans tous les groupes. Pour une raison quelconque dans mes données réelles quand il y a des groupes sans valeurs manquantes, rien n'est remplacé. Il saute simplement ces colonnes. Je ne peux pas reproduire cela avec les données factices donc je vais devoir penser à une solution à moins que vous ayez des idées? – user137698

+0

@ user137698 J'ai changé mon code. Maintenant, cela fonctionne aussi sur les colonnes qui n'ont pas de valeurs manquantes. Essayez et faites le moi savoir. –