una - Eliminación de espacios en blanco de un marco de datos completo en R
eliminar na en r (7)
He intentado eliminar el espacio en blanco que tengo en un marco de datos (usando R) . El marco de datos es grande (> 1 gb) y tiene múltiples columnas que contienen espacios en blanco en cada entrada de datos.
¿Hay alguna manera rápida de eliminar el espacio en blanco de todo el marco de datos? He intentado hacer esto en un subconjunto de las primeras 10 filas de datos usando:
gsub( " ", "", mydata)
Esto no pareció funcionar, aunque R devolvió una salida que no he podido interpretar.
str_replace( " ", "", mydata)
R devolvió 47 advertencias y no eliminó el espacio en blanco.
erase_all(mydata, " ")
R devolvió un error que decía ''Error: no se pudo encontrar la función'' erase_all ''''
Realmente agradecería algo de ayuda con esto, ya que he pasado las últimas 24 horas tratando de abordar este problema.
¡Gracias!
R simplemente no es la herramienta adecuada para ese tamaño de archivo. Sin embargo, tiene 2 opciones:
Use ffdply y ff base
Use los paquetes ff
y ffbase
:
library(ff)
library(ffabse)
x <- read.csv.ffdf(file=your_file,header=TRUE, VERBOSE=TRUE,
first.rows=1e4, next.rows=5e4)
x$split = as.ff(rep(seq(splits),each=nrow(x)/splits))
ffdfdply( x, x$split , BATCHBYTES=0,function(myData)
apply(myData,2,function(x)gsub(''//s+'', '''',x))
Use sed (mi preferencia)
sed -ir "s/(/S)/s+(/S)//1/2/g;s/^/s+//;s//s+$//" your_file
Puede usar la función recortar en R 3.2 en todas las columnas.
myData[,c(1)]=trimws(myData[,c(1)])
Puede hacer un ciclo de esto para todas las columnas en su conjunto de datos. También tiene un buen rendimiento con grandes conjuntos de datos.
Si desea mantener las clases de variables en su data.frame
, debe saber que el uso de apply
afectará porque genera una matrix
donde todas las variables se convierten en character
o numeric
. Basándose en el código de Fremzy y Anthony Simon Mielniczuk puede recorrer las columnas de su data.frame y recortar el espacio en blanco solo de las columnas del factor
de clase o character
(y mantener sus clases de datos):
for (i in names(mydata)) {
if(class(mydata[, i]) %in% c("factor", "character")){
mydata[, i] <- trimws(mydata[, i])
}
}
Retomando Fremzy y Mielniczuk, llegué a la siguiente solución:
data.frame(lapply(df, function(x) if(class(x)=="character") trimws(x) else(x)), stringsAsFactors=F)
Funciona con marcos de datos mixtos numéricos / característicos manipula solo columnas de caracteres.
Si está tratando con grandes conjuntos de datos como este, realmente podría beneficiarse de la velocidad de data.table
.
library(data.table)
setDT(df)
for (j in names(df)) set(df, j = j, value = df[[trimws(j)]])
Esperaría que esta sea la solución más rápida. Esta línea de código utiliza el operador set
de data.table
, que recorre las columnas muy rápido. Aquí hay una buena explicación: Bucle rápido con conjunto .
Si lo entendí correctamente, entonces quiere 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 cambiarlo a un marco de datos, entonces haga lo siguiente:
as.data.frame(apply(myData,2,function(x)gsub(''//s+'', '''',x)))
EDITAR en 2017:
El uso de la función sapply
y trimws
con both=T
puede eliminar los espacios iniciales y finales pero no dentro de él. Dado que no había datos de entrada proporcionados por OP, estoy agregando un ejemplo ficticio para producir los resultados.
df <- data.frame(val = c(" abc"," klm","dfsd "),val1 = c("klm ","gdfs","123"),num=1:3,num1=2:4,stringsAsFactors = F)
truth <- sapply(df,is.character)
df1 <- data.frame(cbind(sapply(df[,truth],trimws,which="both"),df[,!truth]))
Salida :
> df1
val val1 num num1
1 abc klm 1 2
2 klm gdfs 2 3
3 dfsd 123 3 4
> str(df1)
''data.frame'': 3 obs. of 4 variables:
$ val : chr "abc" "klm" "dfsd"
$ val1: chr "klm" "gdfs" "123"
$ num : int 1 2 3
$ num1: int 2 3 4
Retomando Fremzy y el comentario de Stamper, esta es ahora mi práctica rutina para limpiar espacios en blanco en datos:
df <- data.frame(lapply(df, trimws), stringsAsFactors = FALSE)