2010-10-27 16 views
5

Necesito leer un marco de datos de un archivo que contiene valores NULL. Aquí está un ejemplo de archivo:Leer valores nulos del archivo

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

leí este archivo en una trama de datos:

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

Pero entradas "nulo" no son interpretados por R como NULL:

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

¿Cómo debe ¿Formateo mi archivo de entrada para que R trate apropiadamente tales entradas como NULL?

Respuesta

8

siempre siempre siempre lo hacen resumen (cosa) si algo es inesperado.

> 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 

que se ve un poco raro. Profundizar:

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

¿Qué es el diablo?

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

La presencia de un formato numérico válido (la cadena 'NULL') ha causado R para ir "Oh supongo éstos no son números, voy a leer en cadenas de caracteres y hago un factor (categórica variable) para ti ".

La solución acaba de publicarse para usar na.string = "NULL", pero recuerde que NA no es lo mismo que NULL en R. NA es un marcador de datos faltantes, NULL es un valor real no válido. Compare:

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

Una vez que lo ha leído correctamente, la prueba apropiada es generalmente is.na (foo)

+0

+1 Por señalar que esto no puede suceder. – mbq

-2

Nunca he hecho nada en r, pero supongo que su variable tiene el valor "NULO", así que intente comprobar si la variable es igual a la cadena "NULO" en su lugar. Si tiene que usar el método is.null(), puede pasar por sus variables y convertir "NULL" a NULL.

+1

En R, hay un importante diferente entre 'NA' (longitud 1) y' NULL' (longitud 0). – hadley

6

Prueba esto:

> 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