read - ¿Por qué recibo X. en los nombres de mi columna cuando leo un marco de datos?
read.table r example (4)
Hice una pregunta sobre esto hace unos meses , y pensé que la respuesta había resuelto mi problema, pero me encontré con el problema otra vez y la solución no funcionó para mí.
Estoy importando un CSV:
orders <- read.csv("<file_location>", sep=",", header=T, check.names = FALSE)
Aquí está la estructura del marco de datos:
str(orders)
''data.frame'': 3331575 obs. of 2 variables:
$ OrderID : num -2034590217 -2034590216 -2031892773 -2031892767 -2021008573 ...
$ OrderDate: Factor w/ 402 levels "2010-10-01","2010-10-04",..: 263 263 269 268 301 300 300 300 300 300 ...
Si ejecuto el comando de length
en la primera columna, OrderID, obtengo esto:
length(orders$OrderID)
[1] 0
Si corro la length
en OrderDate, regresa correctamente:
length(orders$OrderDate)
[1] 3331575
Este es un copiar / pegar del head
de CSV
.
OrderID,OrderDate
-2034590217,2011-10-14
-2034590216,2011-10-14
-2031892773,2011-10-24
-2031892767,2011-10-21
-2021008573,2011-12-08
-2021008572,2011-12-07
-2021008571,2011-12-07
-2021008570,2011-12-07
-2021008569,2011-12-07
Ahora, si vuelvo a ejecutar read.csv
, pero saco la opción check.names
, la primera columna del dataframe
ahora tiene una X. al comienzo del nombre.
orders2 <- read.csv("<file_location>", sep=",", header=T)
str(orders2)
''data.frame'': 3331575 obs. of 2 variables:
$ X.OrderID: num -2034590217 -2034590216 -2031892773 -2031892767 -2021008573 ...
$ OrderDate: Factor w/ 402 levels "2010-10-01","2010-10-04",..: 263 263 269 268 301 300 300 300 300 300 ...
length(orders$X.OrderID)
[1] 3331575
Esto funciona correctamente
Mi pregunta es por qué R
agrega una X. al principio del primer nombre de columna? Como puede ver en el archivo CSV, no hay caracteres especiales. Debe ser una carga simple. Agregar check.names
, aunque importará el nombre del CSV, hará que los datos no se carguen correctamente para que realice el análisis.
¿Qué puedo hacer para arreglar esto?
Nota al margen: me doy cuenta de que esto es poco importante: estoy más frustrado por el hecho de que creo que estoy cargando correctamente, pero sin obtener el resultado que esperaba. Podría cambiar el nombre de la columna utilizando colnames(orders)[1] <- "OrderID"
, pero aún quiero saber por qué no se carga correctamente.
Ejecuté un problema similar y quería compartir las siguientes líneas de código para corregir los nombres de las columnas. Ciertamente no es perfecto, ya que la programación limpia en el golpe de derecha sería mejor, pero quizás útil como punto de partida para alguien tan rápido y sucio. (Me hubiera gustado agregarlos como comentario a la pregunta de Ryan / la respuesta de Gavin, pero mi reputación no es lo suficientemente alta, así que tuve que publicar una respuesta adicional, lo siento).
En mi caso, varios pasos para escribir y leer datos produjeron una o más columnas llamadas "X", X.1 ", ... que contienen contenido en la columna X y números de fila en las columnas X.1, ...-. En mi caso, el contenido de la columna X debe usarse como nombres de fila y las otras columnas X.1, ...- deben eliminarse.
Correct_Colnames <- function(df) {
delete.columns <- grep("(^X$)|(^X//.)(//d+)($)", colnames(df), perl=T)
if (length(delete.columns) > 0) {
row.names(df) <- as.character(df[, grep("^X$", colnames(df))])
#other data types might apply than character or
#introduction of a new separate column might be suitable
df <- df[,-delete.columns]
colnames(df) <- gsub("^X", "", colnames(df))
#X might be replaced by different characters, instead of being deleted
}
return(df)
}
Me encontré con este problema y fue por una simple razón. Tenía etiquetas que comenzaban con un número, y R agregaba una X delante de todas. Creo que R se confunde con un número en el encabezado y se aplica una letra para diferenciar de los valores.
Entonces, "3_in" se convirtió en "X3_in", etc. Lo resolví cambiando la etiqueta a "in_3" y los problemas se resolvieron.
Espero que esto ayude a alguien.
Resolví un problema similar al incluir row.names = FALSE como argumento en la función write.csv. write.csv incluía los nombres de las filas como una columna sin nombre en el archivo CSV y read.csv nombraba esa columna ''X'' cuando leía el archivo CSV.
read.csv()
es un contenedor alrededor de la función read.table()
más general. Esta última función tiene argumento check.names
que está documentado como:
check.names: logical. If ‘TRUE’ then the names of the variables in the data frame are checked to ensure that they are syntactically valid variable names. If necessary they are adjusted (by ‘make.names’) so that they are, and also to ensure that there are no duplicates.
Si su encabezado contiene etiquetas que no son sintácticamente válidas, make.names()
reemplazará con un nombre válido, basado en el nombre inválido, eliminando caracteres inválidos y posiblemente anteponiendo a X
:
R> make.names("$Foo")
[1] "X.Foo"
Esto está documentado en ?make.names
:
Details: A syntactically valid name consists of letters, numbers and the dot or underline characters and starts with a letter or the dot not followed by a number. Names such as ‘".2way"’ are not valid, and neither are the reserved words. The definition of a _letter_ depends on the current locale, but only ASCII digits are considered to be digits. The character ‘"X"’ is prepended if necessary. All invalid characters are translated to ‘"."’. A missing value is translated to ‘"NA"’. Names which match R keywords have a dot appended to them. Duplicated values are altered by ‘make.unique’.
El comportamiento que está viendo es totalmente coherente con la carga documentada de read.table()
en sus datos. Eso sugeriría que tiene etiquetas sinápticas sintácticamente en la fila del encabezado de su archivo CSV. Tenga en cuenta el punto anterior de ?make.names
que lo que es una letra depende de la configuración regional de su sistema; El archivo CSV puede incluir un carácter válido que se mostrará en el editor de texto, pero si R no se está ejecutando en la misma configuración regional, ese carácter puede no ser válido allí, por ejemplo.
Me gustaría ver el archivo CSV e identificar cualquier carácter que no sea ASCII en la línea del encabezado; posiblemente haya caracteres no visibles (o secuencias de escape; /t
?) en la fila del encabezado también. Mucho puede estar sucediendo entre leer en el archivo los nombres no válidos y mostrarlos en la consola, lo que podría enmascarar los caracteres no válidos, así que no tome en cuenta que no muestra nada incorrecto sin check.names
que indican que el archivo está bien.
Publicar la salida de sessionInfo()
también sería útil.