Saltar al contenido

Eliminar espacios en blanco de un marco de datos completo en R

Solución:

Muchas de las respuestas son más antiguas, por lo que aquí en 2019 es un simple dplyr solución que operará solo en las columnas de caracteres para eliminar los espacios en blanco iniciales y finales.

library(dplyr)
library(stringr)

data %>%
  mutate_if(is.character, str_trim)

## ===== 2020 edit for dplyr (>= 1.0.0) =====
df %>% 
  mutate(across(where(is.character), str_trim))

Puede cambiar el str_trim() función para otros si desea un sabor diferente de eliminación de espacios en blanco.

# for example, remove all spaces
df %>% 
  mutate(across(where(is.character), str_remove_all, pattern = fixed(" ")))

Si lo entendí correctamente, entonces desea eliminar todos los espacios en blanco de todo el marco de datos, supongo que el código que está utilizando es bueno para eliminar espacios en los nombres de las columnas. Creo que debería intentar esto:

 apply(myData,2,function(x)gsub('\s+', '',x))

Espero que esto funcione.

Sin embargo, esto devolverá una matriz, si desea cambiarla a un marco de datos, haga lo siguiente:

as.data.frame(apply(myData,2,function(x)gsub('\s+', '',x)))

EDITAR en 2020:

Utilizando lapply y trimws funcionar con both=TRUE puede eliminar los espacios iniciales y finales, pero no dentro de él. Dado que OP no proporcionó datos de entrada, estoy agregando un ejemplo ficticio para producir los resultados.

DATOS:

df <- data.frame(val = c(" abc"," kl m","dfsd "),val1 = c("klm ","gdfs","123"),num=1:3,num1=2:4,stringsAsFactors = FALSE)

# situación: 1 (Usando Base R), cuando queremos eliminar espacios solo en los extremos inicial y final NO en el interior los valores de cadena, podemos usar recortar

cols_to_be_rectified <- names(df)[vapply(df, is.character, logical(1))]
df[,cols_to_be_rectified] <- lapply(df[,cols_to_be_rectified], trimws)

# situación: 2 (Usando Base R), cuando queremos eliminar espacios en cada lugar del marco de datos en columnas de caracteres (dentro de una cuerda, así como en los extremos inicial y final).

(Esta fue la solución inicial propuesta usando aplicar, tenga en cuenta que una solución que usa aplicar parece funcionar pero sería muy lenta, también con la pregunta aparentemente no está muy clara si OP realmente quería eliminar el espacio en blanco inicial / final o todos los espacios en blanco en los datos)

cols_to_be_rectified <- names(df)[vapply(df, is.character, logical(1))]
df[,cols_to_be_rectified] <- lapply(df[,cols_to_be_rectified], function(x)gsub('\s+','',x))

## situación: 1 (Usando data.table, eliminando solo los espacios en blanco iniciales y finales)

library(data.table)
setDT(df)
cols_to_be_rectified <- names(df)[vapply(df, is.character, logical(1))]
df[,c(cols_to_be_rectified) := lapply(.SD, trimws), .SDcols = cols_to_be_rectified]

Producción desde situación1:

    val val1 num num1
1:  abc  klm   1    2
2: kl m gdfs   2    3
3: dfsd  123   3    4

## situación: 2 (Usando data.table, eliminando todos los espacios en blanco del interior, así como los espacios en blanco iniciales / finales)

cols_to_be_rectified <- names(df)[vapply(df, is.character, logical(1))]
df[,c(cols_to_be_rectified) := lapply(.SD, function(x)gsub('\s+', '', x)), .SDcols = cols_to_be_rectified]

Producción desde situación2:

    val val1 num num1
1:  abc  klm   1    2
2:  klm gdfs   2    3
3: dfsd  123   3    4

Tenga en cuenta la diferencia entre las salidas de ambas situaciones, en la fila número 2: puede ver que, con trimws podemos eliminar los espacios en blanco iniciales y finales, pero con la solución de expresiones regulares podemos eliminar todos los espacios en blanco.

Espero que esto ayude, gracias

Retomando Fremzy y el comentario de Stamper, esta es ahora mi práctica rutina para limpiar los espacios en blanco en los datos:

df <- data.frame(lapply(df, trimws), stringsAsFactors = FALSE)

Como otros han notado, esto cambia todos los tipos de personajes. En mi trabajo, primero determino los tipos disponibles en el original y las conversiones requeridas. Después de recortar, vuelvo a aplicar los tipos necesarios.

Si sus tipos originales están bien, aplique la solución de MarkusN a continuación https://stackoverflow.com/a/37815274/2200542

Aquellos que trabajan con archivos de Excel pueden desear explorar el paquete readxl que por defecto es trim_ws = TRUE al leer.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *