2010-10-27 21 views
5

Ho bisogno di leggere un frame di dati da un file contenente valori NULL. Ecco un esempio di file:Leggi valori nulli dal file

 
charCol floatCol intCol 
a  1.5  10 
b  NULL  3 
c  3.9  NULL 
d  -3.4  4 

ho letto questo file in un frame di dati:

> df <- read.table('example.dat', header=TRUE) 

Ma le voci "NULL" non sono interpretati da R come NULL:

> is.null(df$floatCol[2]) 
[1] FALSE 

Come dovrebbe Formattare il mio file di input in modo che R tratti correttamente tali voci come NULL?

risposta

8

Sempre sempre sempre fare sintesi (cosa) se qualcosa è inaspettato.

> summary(df) 
charCol floatCol intCol 
a:1  1.5 :1 10 :1 
b:1  -3.4:1 3 :1 
c:1  3.9 :1 4 :1 
d:1  NULL:1 NULL:1 

che sembra un po 'strano. Drill down:

> summary(df$floatCol) 
1.5 -3.4 3.9 NULL 
    1 1 1 1 

che diavolo è?

> class(df$floatCol) 
[1] "factor" 

La presenza di un formato numerico non valido (la stringa 'NULL') ha causato R per andare "oh Credo che questi non sono i numeri, io li leggo in stringhe di caratteri e fare un fattore (categorica variabile) per te ".

La soluzione è stata appena pubblicata per utilizzare na.string = "NULL", ma ricorda che NA non è uguale a NULL in R. NA è un indicatore per dati mancanti, NULL è un vero non valore. Confronta:

> c(1,2,3,NULL,4) 
[1] 1 2 3 4 
> c(1,2,3,NA,4) 
[1] 1 2 3 NA 4 

Una volta che hai letto correttamente, il test appropriato è di solito is.na (foo)

+0

+1 per indicare che questo non può accadere. – mbq

-2

Non ho mai fatto nulla in r, ma suppongo che la variabile abbia il valore "NULL", quindi prova a verificare se la variabile è uguale alla stringa "NULL". Se devi usare il metodo is.null() puoi passare attraverso le tue variabili e convertire "NULL" in NULL.

+1

In R, v'è una importante differenza tra 'NA' (lunghezza 1) e' NULL' (lunghezza 0). – hadley

6

Prova questo:

> Lines <- "charCol floatCol intCol 
+ a  1.5  10 
+ b  NULL  3 
+ c  3.9  NULL 
+ d  -3.4  4" 
> 
> # DF <- read.table("myfile", header = TRUE, na.strings = "NULL") 
> DF <- read.table(textConnection(Lines), header = TRUE, na.strings = "NULL") 
> DF 
    charCol floatCol intCol 
1  a  1.5  10 
2  b  NA  3 
3  c  3.9  NA 
4  d  -3.4  4