2017-01-22 2 views
0

J'essaie d'imputer la trame de données avec le modèle Hmisc imputé. Je suis en mesure d'imputer les données pour une colonne à la fois, mais ne parviens pas à boucler sur les colonnes.en boucle sur chaque colonne pour imputer des données dans R mais ne remplace pas les données imputées

exemple ci-dessous - fonctionne très bien, mais je voudrais le rendre dynamique en utilisant une fonction:

impute_marks$col1 <- with(impute_marks, round(impute(col1, mean)),0) 

Exemple:

impute_dataframe <- function() 
{ 
    for(i in 1:ncol(impute_marks)) 
    { 
    impute_marks[is.na(impute_marks[,i]), i] <- with(impute_marks, round(impute(impute_marks[,i], mean)),0) 
    } 
} 
impute_dataframe 

Il n'y a pas d'erreur quand je lance la fonction, mais il n'y en a données imputées ainsi à l'ensemble de données impute_marks.

Répondre

1

Hmisc::impute est déjà une fonction, pourquoi ne pas simplement utiliser apply et enregistrer une boucle for ?:

library(Hmisc) 
age1 <- c(1,2,NA,4) 
age2 <- c(NA, 4, 3, 1) 
mydf <- data.frame(age1, age2) 

mydf 
    age1 age2 
1 1 NA 
2 2 4 
3 NA 3 
4 4 1 

apply(mydf, 2, function(x) {round(impute(x, mean))}) 
    age1 age2 
1 1 3 
2 2 4 
3 2 3 
4 4 1 

EDIT: Pour garder mydf comme vous pouvez data.frame coherce en arrière comme ceci:

mydf <- as.data.frame(mydf) 

Mais ce que je ferais est d'utiliser un autre paquet purrr qui est un bel ensemble d'outils autour de cette idée d'application/cartographie. map_df par exemple renvoie toujours un objet data.frame, il y a un tas de map_x que vous pouvez voir avec ?map

library(purrr) 
map_df(mydf, ~ round(impute(., mean))) 

Je sais qu'il est préférable d'utiliser les fonctions de base de R, mais purrr rend tellement plus facile les opérations de style apply .

+1

Je suis assez nouveau à R. Je n'étais pas au courant de la fonction d'application. Merci de l'avoir signalé. J'ai été capable de réaliser ce que je voulais mais j'ai obtenu une matrice plutôt qu'un cadre de données à la fin de l'opération. Comment puis-je le convertir en trame de données après imputation. voici ce que j'ai: num [1: 153, 1:26] 55 68 .... toutes les valeurs. plutôt que 153 obs. 26 variables –

+0

Je l'ai fait résoudre en enveloppant tout le côté droit en utilisant as.data.frame() –

+0

si vous vous trouvez en train de faire beaucoup, regardez 'library (purrr)' il a une bonne syntaxe et je pense que c'est plus intuitif que les fonctions de base 'apply',' lapply', etc. – Nate

1

Nous pouvons utiliser na.aggregate de zoo qui peut être appliqué directement sur le jeu de données

library(zoo) 
round(na.aggregate(mydf)) 
# age1 age2 
#1 1 3 
#2 2 4 
#3 2 3 
#4 4 1 

ou dans chaque colonne séparément avec lapply

mydf[] <- lapply(mydf, function(x) round(na.aggregate(x))) 

Par défaut, na.aggregate donne la mean. Mais, nous pouvons changer le