2010-05-04 10 views
13

che sto cercando di sostituire gli elementi di un data.frame contenente "# N/A" con "NULL", e sto correndo in problemi:R: Come sostituire gli elementi di un data.frame?

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 

indices_of_NAs <- which(foo == "#N/A") 

replace(foo, indices_of_NAs, "NULL") 

Error in [<-.data.frame (*tmp*, la lista, il valore = "NULL"): nuove colonne lascerebbero buchi dopo le colonne esistenti

Penso che il problema è che il mio indice tratta il data.frame come un vettore, ma che la funzione di sostituzione lo sta trattando in qualche modo in modo diverso, ma Non sono sicuro di quale sia il problema?

risposta

19

NULL significa davvero "niente", non "mancante", quindi non può prendere il posto di un valore effettivo - poiché R mancante utilizza NA.

È possibile utilizzare il metodo di sostituzione di is.na per aggiornare direttamente gli elementi selezionati, questo funzionerà con un risultato logico. (Usando il quale per gli indici funzionerà solo con is.na, l'uso diretto di [richiama l'accesso alla lista, che è la causa del tuo errore).

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 
NAs <- foo == "#N/A" 

## by replace method 
is.na(foo)[NAs] <- TRUE 

## or directly 
foo[NAs] <- NA 

Ma, si sta già trattando con le stringhe (in realtà un fattore di default) nel vostro od colonna con la coercizione forzata quando è stato creato con c(), e potrebbe essere necessario per il trattamento di colonne singolarmente. Qualsiasi colonna numerica non avrà mai una corrispondenza sulla stringa "# N/A", ad esempio.

+0

Non mi sono mai accorto che c'era un "is.na <-", troppo bello. – geoffjentry

+0

Cosa intendi con "Qualsiasi colonna numerica non avrà mai una corrispondenza sulla stringa" # N/A ", ad esempio."? Come posso verificare che tipo di colonna sto guardando? – spier

+0

Bella soluzione. Come si fa a reinterpretare le colonne come numeriche dopo aver sostituito i valori con NA? Ho dozzine di colonne ed è troppo difficile dire quali hanno valori NA modificati. – Dave

1

La funzione di sostituzione si aspetta un vettore e si sta fornendo un data.frame.

Si dovrebbe davvero provare a utilizzare NA e NULL invece dei valori dei caratteri che si stanno attualmente utilizzando. Altrimenti non sarai in grado di sfruttare tutte le funzionalità di R per gestire i valori mancanti.

Modifica

Si potrebbe utilizzare una funzione di applicare, o fare qualcosa di simile:

foo <- data.frame(day= c(1, 3, 5, 7), od = c(0.1, NA, 0.4, 0.8)) 
idx <- which(is.na(foo), arr.ind=TRUE) 
foo[idx[1], idx[2]] <- "NULL" 

Non è possibile assegnare un valore reale NULL in questo caso, perché ha lunghezza zero. È importante capire la differenza tra NA e NULL, quindi ti consiglio di leggere ?NA e ?NULL.

+0

Grazie Shane, mi consiglia di convertire il mio data.frame in un vettore, eseguire la funzione e quindi riconvertirla in un data.frame? Userò i formati di dati che suggerisci. – John

12

Perché non

x$col[is.na(x$col)]<-value 

?
Non è necessario modificare il dataframe

Problemi correlati