2012-02-01 6 views
18

Cuando uso la función read.csv() en R para cargar datos, a menudo encuentro que se ha agregado una X a nombres de variables. Creo que casi siempre lo veo en la primera variable, pero podría estar equivocado.R- ¿Por qué se agregan las X a los nombres de las variables en mi marco de datos?

Al principio, pensé que R podría estar haciendo esto porque tenía un espacio al comienzo del nombre de la variable - no es así.

En segundo lugar, leí en alguna parte que si tiene una variable que comienza con un número, o es un nombre de variable muy corto, R agregaría la X. El nombre de la variable es todo el texto y la longitud del nombre de este la variable tiene 12 caracteres, por lo que no es corta.

Ahora, esto es puramente una molestia. Puedo cambiar el nombre de la columna, pero agrega un paso, aunque pequeño.

¿Hay alguna manera de evitar que esto del pícaro X se infiltre en mi marco de datos?

Aquí está mi código original:

df <- read.csv("/file/location.filecsv", header=T, sep=",") 

Aquí es la variable en cuestión:

str(orders) 
'data.frame': 2620276 obs. of 26 variables: 
$ X.OrderDetailID : Factor w/ 2620193 levels "(2620182 row(s) affected)",..: 105845 
+1

Se puede publicar los nombres de las variables con las X y el código que se utiliza para leer los datos? –

+1

Todavía no entiendo * por qué * esto está sucediendo. El hecho de que suceda (¿sobre todo?) Al primer nombre de variable me sugiere que de algún modo terminas con un personaje especial invisible al comienzo de tus archivos. –

Respuesta

32

read.table y read.csv tienen un argumento check.names= que se puede establecer a FALSE.

Por ejemplo, probar con este entrada que consiste en sólo un encabezado:

> read.csv(text = "a,1,b") 
[1] a X1 b 
<0 rows> (or 0-length row.names) 

frente

> read.csv(text = "a,1,b", check.names = FALSE) 
[1] a 1 b 
<0 rows> (or 0-length row.names) 
+0

check.names = FALSE es el ganador ... ¡Gracias por la ayuda! – mikebmassey

3

Es sorprendente comportamiento, pero yo creo que tendríamos un ejemplo reproducible. ¿Quizás tengas algunos personajes invisibles/especiales escondidos en tu archivo?

names(read.csv(textConnection(
"abcdefghijkl, a1,2x"))) 

se comporta bien. ¿Puedes hacer un ejemplo a lo largo de estas líneas que demuestre tu problema?

Como se describe en la otra respuesta, check.names=FALSE es una posible solución. Usted puede experimentar con make.names para determinar el comportamiento ...

2

Como dijo Gabor, por defecto read.csv deafults para convertir los nombres de la fila de encabezado a ser nombres de variables válidos (check.names = FALSE utilizar para desactivar esta opción). Esto se hace usando la función make.names. La página de ayuda para esa función explica qué constituye un nombre de variable válido.

Un nombre válido sintácticamente se compone de letras, números y el punto o caracteres de subrayado y comienza con una letra o el punto de no seguirse por un número. Los nombres como ".2way" no son válidos, y tampoco lo son las palabras reservadas.

La lista de palabras reservadas se encuentra en la página de ayuda ?reserved.

La otra condición es que el nombre de la variable debe ser de 10000 caracteres o menos, pero make.names no lo acortará. Así que tenga cuidado de ser realmente detallado con sus nombres de variables.

Puede comprobar si los nombres de variables válidos utilizando

library(assertive.code) 
is_valid_variable_name(x) 
+0

A una velocidad de escritura promedio de 200 caracteres por minuto, eso es 50 minutos para escribir cada nombre de variable, ¡ay! – James

Cuestiones relacionadas