Comment remplir NA avec une médiane?
De données, par exemple:
set.seed(1)
df <- data.frame(years=sort(rep(2005:2010, 12)),
months=1:12,
value=c(rnorm(60),NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA))
head(df)
years months value
1 2005 1 -0.6264538
2 2005 2 0.1836433
3 2005 3 -0.8356286
4 2005 4 1.5952808
5 2005 5 0.3295078
6 2005 6 -0.8204684
Dites-moi s'il vous plaît, comment je peux remplacer NA dans le df$de la valeur de la médiane des autres mois? "valeur" doit contenir la médiane de la valeur de toutes les valeurs précédentes pour le même mois. Qui est, si le courant du mois de Mai, la "valeur" doit contenir la valeur médiane pour toutes les valeurs précédentes du mois de Mai.
+1 parce que vous avez réussi à crochet 5 réponses différentes dans les 10 minutes.
J'ai édité la question d'inclure
J'ai édité la question d'inclure
set.seed(1)
OriginalL'auteur Sheridan | 2012-08-15
Vous devez vous connecter pour publier un commentaire.
Ou avec ave
Car il ya tellement de nombreuses réponses nous allons voir qui est plus rapide.
J'aurais pu parier que les données.le tableau a été le plus rapide.
[ Matthieu Dowle ] La tâche chronométrée prend ici tout au plus de 0,02 secondes (2.075/100).
data.table
estime qu'insignifiant. Essayez de définirreplications
à1
et l'augmentation de la taille des données, à la place. Ou le moment le plus rapide des 3 essais est également un principe de base commun. Plus de commentaires de discussion de ces liens :+1 très clairement fait.
data.table
brille vraiment une fois les données est grand et/ou le regroupement de la variable a beaucoup de niveaux. avec un ensemble de données différent, tous vos timings serait très différent.Comment est
ave
vraiment différent detapply
? Est-il justetapply
avecmean
comme valeur par défaut et une syntaxe légèrement différente?La principale différence réside dans la valeur retournée.
ave
sera de retour un vecteur de la même longueur que ledf
dans ce cas, touttapply
retourne un vecteur de longueurunique(months)
. C'est juste une question de ce que la production est plus pratique pour vous.Ah je vois, Merci.
OriginalL'auteur Luciano Selzer
vous souhaitez utiliser le test
is.na
fonction:qui dit que pour toutes les valeurs où
df$value
estNA
, remplacez-la par le côté droit. Vous avez besoin de lana.rm=TRUE
meuble ou lamedian
fonction sera de retourNA
pour ce faire mois par mois, il y a beaucoup de choix, mais je pense que
plyr
a la syntaxe la plus simple:vous pouvez également utiliser
data.table
. c'est surtout un bon choix si vos données est importante:Il existe de nombreuses autres façons, mais il y a deux!
plyr
beaucoup, donc je suis juste curieux, quelle est la principale différence entretransform
(que vous avez utilisé) etsummarize
qui Sacha utilisé?transform
est de modifier ou d'ajouter une colonne à unedata.frame
. comme ce sera le retour de l'ensemble de la trame de données de donnée plus toutes les nouvelles lignes que vous avez ajouté.summarise
retourne un "résumé" en moyenne, par mois ou quelque chose et de ne retourner que les lignes spécifié.Nice, tu ne connaissais pas
transform
. J'ai pensé qu'il devrait y avoir un moyen de le faire en une seule ligne avecplyr
.La même question posée ici: stackoverflow.com/questions/9322773/... mais avec une moyenne de
OriginalL'auteur Justin
Voici le plus robuste solution je pense. Il assure le ans sont classés correctement et correctement calculer la médiane pour tous les mois précédents dans le cas où vous avez plusieurs années avec des valeurs manquantes.
+1 Pour la solution solide.
OriginalL'auteur Joshua Ulrich
Coller avec de la base de R, vous pouvez également essayer les suivantes:
NA
, qui n'est probablement pas le cas de l'OP de l'ensemble des données.et donc un downvote? Désolé, mais je ne vois pas ce que vous en attendez. Est-ce que votre solution de fournir un rouleau médian pour plus d'une année de données manquantes? Si donc, encore une fois, je ne suis pas un régulier
plyr
utilisateur, veuillez mettre à jour votre réponse avec un exemple concret.Désolé, c'était inutile, certes, mais qui ne peuvent pas le réparer. Je passe trop de temps sur Reddit vers le bas-droit de vote des choses, cela devient automatique 🙂 Comme pour
plyr
, Justins réponse est beaucoup mieux.Ici, je vais upvote de le corriger pour vous. Des acclamations.
ha. J'ai regardé le modifier avant de l'avoir vu votre commentaire, et de la pensée, "ce qu'un inutile edit" 🙂
OriginalL'auteur A5C1D2H2I1M1N2O1R2T1
Il est une autre façon de le faire avec
dplyr
.Si vous voulez remplacer toutes les colonnes avec leurs médiane, n':
Si vous souhaitez remplacer un sous-ensemble de colonnes (comme "valeur" dans OP exemple), faites:
OriginalL'auteur Sam H.
C'est une façon, à l'aide de
plyr
, il n'est pas très jolie, mais je pense que c'est ce que vous voulez:OriginalL'auteur Sacha Epskamp