2012-11-15 7 views
0

me semble avoir trébuché sur une situation dans mes efforts pour apprendre à utiliser R. J'ai un ensemble de données qui ressemble à ceci:Remplacer toutes les valeurs qui diffèrent de la valeur « NA »

 
col1/ col2/ col3 

NA/1/2 

1/NA /2 

Ce que je dois faire est de remplacer tout ce n'est pas NA avec une autre valeur (voir ci-dessous)

 
Col1/col2/ col 3 

NA/Data/Data 

Data/NA/ Data 

Je l'ai regardé partout sur le web, il semble que tout le monde veut remplacer NA « s avec d'autres valeurs, je d'autre part besoin de l'exact opposé, mais a été incapable de trouver une commande. J'ai même regardé dans « If » mais n'a été en mesure de trouver des fonctions qui remplacent les valeurs si elles sont eiter < ou = ou > à un certain nombre. Je besoin de quelque chose qui précisera ... « si elle est différente de NA, puis remplacez-les .... »

Répondre

2

Les données:

dat <- data.frame(col1 = c(NA, 1), col2 = c(1, NA), col3 = c(2, 2)) 

Pour choisir toutes les valeurs qui sont pasNA, utilisez la opérateur logique ! ("non") ainsi is.na:

dat[!is.na(dat)] <- "Data" 

    col1 col2 col3 
1 <NA> Data Data 
2 Data <NA> Data 

la même chose peut être réalisé avec la fonction replace:

replace(dat, !is.na(dat), "Data") 

Une autre approche est nécessaire si vous voulez remplacer les valeurs des facteurs. Ceci peut être réalisé avec la commande suivante:

replace(data.frame(lapply(dat, as.character), stringsAsFactors = FALSE), 
     !is.na(dat), "Data") 
+0

Le seul problème avec cette approche est qu'elle fait une copie complète d'un objet de la même taille que dat – mnel

+0

@mnel pas tout à fait, 'is.na (dat) 'aboutit à une matrice logique, qui est un objet plus petit que la trame de données d'origine. 'object.size (dat)' résultats en 568 octets et 'object.size (!) is.na (dat)' à 368 octets. En outre, il ne peut probablement pas être aidé. Si l'objet est que grand que cela causera des problèmes de mémoire, puis le faire cellule par cellule (par exemple, avec deux boucles) sera probablement lente intolérablement. –

+0

Malheureusement, aucune des suggestions ne fonctionne pour moi. dat <- data.frame (col1 = c (NA, 1), col2 = c (1, NA), col3 = c (2, 2)) Ci-dessus je ne peux pas utiliser, parce que ce que j'ai nommé dans mon exemple 1, 2, dans mon vrai dataframe je peux avoir même 1 million de valeurs uniques. dat <- "données" Cela me donne cette erreur et il semble générer NA est pour toutes les valeurs du 8 dataframe [is.na (dat)!]. Dans '[<- factor' (' * tmp * ', thisvar, value = "données"): niveau de facteur non valide, NAs générés remplacer (! dat, is.na (dat), "données") celui-ci me donne exactement la même erreur que le above.I Je suppose que je vais devoir continuer à chercher David –

Questions connexes