2017-08-08 1 views
2

J'ai un gros data.frame appelé "mat" de 49952 obs. de 7597 variables et j'essaie de remplacer les NA par des zéros. Voici et exemple comment mon data.frame ressemble à:Remplacement rapide de NA - une erreur ou un avertissement

A B C E F D Q Z . . . 
1 1 1 0 NA NA 0 NA NA 
2 0 0 1 NA NA 0 NA NA 
3 0 0 0 NA NA 1 NA NA 
4 NA NA NA NA NA NA NA NA 
5 0 1 0 1 NA 0 NA NA 
6 1 1 1 0 NA 0 NA NA 
7 0 0 1 0 NA 1 NA NA 
. 
. 
. 

J'ai besoin d'un outil vraiment rapide pour les remplacer. Le résultat devrait ressembler à:

A B C E F D Q Z . . . 
1 1 1 0 0 0 0 0 0 
2 0 0 1 0 0 0 0 0 
3 0 0 0 0 0 1 0 0 
4 0 0 0 0 0 0 0 0 
5 0 1 0 1 0 0 0 0 
6 1 1 1 0 0 0 0 0 
7 0 0 1 0 0 1 0 0 
. 
. 
. 

J'ai déjà essayé lapply(mat, function(x){replace(x, is.na(x),0)}) - n'a pas fonctionné - mat[is.na(mat)] <- 0 - erreur et et peut-être trop lent - et aussi link - ne fonctionnait pas trop.

@Sotos m'a déjà conseillé plyr::rbind.fill(lapply(L, as.data.frame)) mais ça n'a pas marché, parce qu'il fait data.frame des observations 379485344 et 1 variable (qui est 49952x7597) donc je dois aussi trafnsform revenir. Y a-t-il une meilleure façon de faire cela?

La structure réelle de mon data.frame:

> str(mat) 
'data.frame': 49952 obs. of 7597 variables: 
$ 6794602 : num 1 NA NA NA NA 0 0 0 0 0 ... 
$ 1008667 : num NA 1 0 NA NA 0 0 0 0 0 ... 
$ 8009082 : num NA 0 1 NA NA NA NA NA NA NA ... 
$ 6740421 : num NA NA NA 1 NA 0 0 0 0 0 ... 
$ 6777805 : num NA NA NA NA 1 NA NA NA NA NA ... 
$ 1001682 : num NA NA NA NA NA 0 0 0 0 0 ... 
$ 1001990 : num NA NA NA NA NA 0 0 0 0 0 ... 
$ 1002541 : num NA NA NA NA NA 0 0 0 0 0 ... 
$ 1002790 : num NA NA NA NA NA 0 0 0 0 0 ... 

Note:

quand j'ai essayé mat[is.na(mat)] <- 0 il y avait un avertissement:

> mat[is.na(mat)] <- 0 
Warning messages: 
1: In `[<-.factor`(`*tmp*`, thisvar, value = 0) : 
    invalid factor level, NA generated 
2: In `[<-.factor`(`*tmp*`, thisvar, value = 0) : 
    invalid factor level, NA generated 
> nlevels(mat) 
[1] 0 

data.frame mat après l'utilisation mat[is.na(mat)] <- 0:

> str(mat) 
'data.frame': 49952 obs. of 7597 variables: 
$ 6794602 : num 1 0 0 0 0 0 0 0 0 0 ... 
$ 1008667 : num 0 1 0 0 0 0 0 0 0 0 ... 
$ 8009082 : num 0 0 1 0 0 0 0 0 0 0 ... 
$ 6740421 : num 0 0 0 1 0 0 0 0 0 0 ... 
$ 6777805 : num 0 0 0 0 1 0 0 0 0 0 ... 
$ 1001682 : num 0 0 0 0 0 0 0 0 0 0 ... 
$ 1001990 : num 0 0 0 0 0 0 0 0 0 0 ... 
$ 1002541 : num 0 0 0 0 0 0 0 0 0 0 ... 
$ 1002790 : num 0 0 0 0 0 0 0 0 0 0 ... 

Ainsi, les questions sont les suivantes:

  1. est-il un autre moyen rapide pour remplacer le NA?
  2. L'avertissement est-il un gros problème? Parce que les données après l'utilisation mat[is.na(mat)] <- 0 ressemble à ce que je veux, mais il y a trop de valeurs, donc je ne peux pas vérifier si elles vont bien.
+0

'mat [is.na (mat)] = 0' devrait être le moyen le plus rapide, les mains vers le bas (sur les matrices denses). Si ce n'est pas le cas, c'est un bug flagrant dans R ... –

+1

C'est un avertissement pas une erreur, et ça explique bien ce qui se passe, n'est-ce pas? Si vous êtes surpris que les données ont des facteurs, essayez peut-être 'View (mat [sapply (mat, is.factor)])' ou 'str' au lieu de' View'. – Frank

+0

@Frank Bien la question contient la sortie de 'str (mat)' et il n'y a pas de facteurs. Mais le message d'avertissement ne correspond tout simplement pas à cette sortie. –

Répondre

2

les opérations suivantes:

mat %>% replace(is.na(.), 0) 
+0

Cela prend plus de temps que 'mat [is.na (mat)] <- 0' mais peut-être que je le laisserai passer la nuit pour savoir s'il y aura aussi l'avertissement. Edit: cela prend plus de temps - avertissement. Donc, comme je l'ai écrit ci-dessus, je pense que je vais ignorer l'avertissement. –

+0

Pouvez-vous vérifier le problème suivant pour comprendre ce message d'avertissement? Cela pourrait aider à résoudre. https://stackoverflow.com/a/16820025/8382207 – Sagar

0

Si vous pensez que certaines de vos colonnes sont des facteurs, vous pouvez utiliser le code suivant pour les détecter et les remplacer par des valeurs numériques.

inx <- sapply(mat, inherits, "factor") 
mat[inx] <- lapply(mat[inx], function(x) as.numeric(as.character(x))) 

Ensuite, essayez ce qui suit.

mat[] <- lapply(mat, function(x) {x[is.na(x)] <- 0; x}) 
mat 

Et voici les données.

mat <- 
structure(list(A = c(1L, 0L, 0L, NA, 0L, 1L, 0L), B = c(1L, 0L, 
0L, NA, 1L, 1L, 0L), C = c(0L, 1L, 0L, NA, 0L, 1L, 1L), E = c(NA, 
NA, NA, NA, 1L, 0L, 0L), F = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_), D = c(0L, 0L, 1L, NA, 
0L, 0L, 1L), Q = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_), Z = c(NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_)), .Names = c("A", "B", "C", "E", 
"F", "D", "Q", "Z"), row.names = c("1", "2", "3", "4", "5", "6", 
"7"), class = "data.frame") 
+0

messages d'avertissement: 'Messages d'avertissement: 1: Dans' [<-. Factor' ('* tmp *', is.na (x), valeur = 0): niveau de facteur non valide, NA généré 2: Dans '[-. Factor' (' * tmp * ', is.na (x), valeur = 0): niveau de facteur invalide, NA généré' peut-être je vais ignorer l'avertissement, ce n'est pas l'erreur comme dans autres cas. –

+0

@ MartinaZapletalová Si votre sortie de 'str (mat)' est correcte, cela ne devrait pas arriver, puisque toutes les colonnes sont de la classe 'numeric'. Êtes-vous sûr que toutes ces 7597 variables sont 'numeric'? Si deux d'entre eux sont des facteurs, vous devrez peut-être les convertir en «numérique» en premier. –

+0

donc j'ai essayé ceci: 'a <- 0 for (i in 1: ncol (mat)) { si (classe (mat [[i]]) == "numérique") { un <- un +1 } else { a <- a + 1 impression (i) }} ' et a découvert qu'il ya problème dans mat [[2260]] et mat [[2261]] donc je regardé et vous aviez raison ils sont facteur mais je ne comprends pas comment cela pourrait se produire. –