2012-05-21 21 views
26

Después de importar un archivo, siempre trato de eliminar los espacios de los nombres de las columnas para facilitar la referencia a los nombres de las columnas.Cómo arreglar espacios en nombres de columna de un data.frame (eliminar espacios, inyectar puntos)?

¿Hay una manera mejor de hacer esto aparte de usar la transformación y luego quitar la columna adicional que crea este comando?

Esto es lo que uso ahora:

names(ctm2) 
#tranform function does this, but requires some action 
ctm2<-transform(ctm2,dymmyvar=1) 
#remove dummy column 
ctm2$dymmyvar <- NULL 
names(ctm2) 
+2

utilizar la función inject.dots: 'inject.dots <- function (df) {nombres (df) <- sub (" """, nombres (df)); df}' –

+0

En un lado serio, me sorprende las importaciones de R en los nombres de columna con espacios y no lo corrige automáticamente. –

+4

@TylerRinker La función read.table lo hace de forma predeterminada con la función 'make.names'. –

Respuesta

45

Existe solución más elegante y general para ese propósito:

tidy.name.vector <- make.names(name.vector, unique=TRUE) 

make.names() hace nombres sintácticamente válidos de vectores de caracteres. Un nombre sintácticamente válido consiste en letras, números y los caracteres de punto o subrayado y comienza con una letra o el punto no seguido de un número.

Además, la marca unique=TRUE le permite evitar posibles duplicados en los nuevos nombres de columna.

+0

En su código, ¿qué es el nombre del dataframe? – mike

1

Basta con asignar a names(ctm2):

names(ctm2) <- c("itsy", "bitsy", "eeny", "meeny") 

o en forma controlada por datos:

names(ctm2) <- paste("myColumn", 1:ncol(ctm2), sep="") 

Otra posibilidad es la de editar su archivo fuente ...

15

sustituir únicamente el primer espacio en cada columna también se puede hacer:

names(ctm2) <- sub(" ", ".", names(ctm2)) 

o para reemplazar todos los espacios (que parece que sería un poco más útil):

names(ctm2) <- gsub(" ", "_", names(ctm2)) 

o, como se menciona en la primera respuesta (aunque no de una manera que arreglar todos los espacios):

spaceless <- function(x) {colnames(x) <- gsub(" ", "_", colnames(x));x} 
newDF <- spaceless(ctm2) 

donde x es el nombre de su hoja.de.datos. Prefiero usar "_" para evitar problemas con "." como parte de una identificación.

El punto es que gsub no se detiene en la primera instancia de una coincidencia de patrón.

+0

El problema con esto, al menos en mi extremo, es: si el nombre de una columna tiene más de un espacio, solo reemplazará el primero – AmagicalFishy

1

Hay una manera fácil de eliminar espacios en los nombres de columna en data.table. Tendrá que convertir su marco de datos en tabla de datos.

setnames(x=DT, old=names(DT), new=gsub(" ","",names(DT))) 

Country Code se convertirá en CountryCode

+0

Omita 'viejo' y tendrá el mismo resultado. (Esto está cubierto en los documentos). – Frank

0

Asignar los nombres como este. Esto funciona mejor Reemplaza todos los espacios en blanco en el nombre con guión bajo.

names(ctm2)<-gsub("\\s","_",names(ctm2))

0

Alternativamente, usted puede ser capaz de lograr los mismos resultados con el paquete stingr.

names(ctm2)<-names(ctm2)%>% stringr::str_replace_all("\\s","_")