Tengo algunos problemas con los espacios en blanco iniciales y finales en un data.frame. Por ejemplo, me gusta echar un vistazo a un específico row
en data.frame
función de una determinada condición:
> myDummy[myDummy$country == c("Austria"),c(1,2,3:7,19)]
[1] codeHelper country dummyLI dummyLMI dummyUMI
[6] dummyHInonOECD dummyHIOECD dummyOECD
<0 rows> (or 0-length row.names)
Me preguntaba por qué no obtuve la producción esperada ya que el país Austria obviamente existía en mi data.frame
. Después de revisar mi historial de código e intentar averiguar qué salió mal, intenté:
> myDummy[myDummy$country == c("Austria "),c(1,2,3:7,19)]
codeHelper country dummyLI dummyLMI dummyUMI dummyHInonOECD dummyHIOECD
18 AUT Austria 0 0 0 0 1
dummyOECD
18 1
Todo lo que he cambiado en el comando es un espacio en blanco adicional después de Austria.
Obviamente surgen problemas molestos. Por ejemplo, cuando me gusta fusionar dos cuadros en función de la columna del país. Uno data.frame
usa "Austria "
mientras que el otro marco tiene "Austria"
. La coincidencia no funciona.
- ¿Hay una buena manera de "mostrar" el espacio en blanco en mi pantalla para que sea consciente del problema?
- ¿Y puedo eliminar los espacios en blanco iniciales y finales en R?
Hasta ahora solía escribir un Perl
script simple que elimina el espacio en blanco, pero sería bueno si de alguna manera puedo hacerlo dentro de R.
sub()
usa laPerl
notación. Lo siento por eso. Voy a intentar usar la función. Pero para mi primera pregunta todavía no tengo una solución.Respuestas:
Probablemente, la mejor manera es manejar los espacios en blanco al leer su archivo de datos. Si usa
read.csv
oread.table
puede establecer el parámetrostrip.white=TRUE
.Si desea limpiar las cadenas después, puede usar una de estas funciones:
Para usar una de estas funciones en
myDummy$country
:Para 'mostrar' el espacio en blanco que podría usar:
que le mostrará las cadenas entre comillas (") haciendo que los espacios en blanco sean más fáciles de detectar.
fuente
str_trim
en elstringr
paquete.A partir de R 3.2.0 se introdujo una nueva función para eliminar espacios en blanco iniciales / finales:
Ver: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html
fuente
\n
estar en la clase de caracteres cubiertos.trimws("SELECT\n blah\n FROM foo;")
Todavía contiene nuevas líneas.trimws
expresión regular es lo suficientemente rápida.stringr::str_trim
(basado enstringi
) también es interesante porque utiliza una biblioteca de cadenas internacionalizada completamente independiente. Uno pensaría que el espacio en blanco sería inmune a los problemas con la internacionalización, pero me pregunto. Nunca he visto una comparación de resultados de nativos vsstringr
/stringi
o cualquier punto de referencia.trimws()
no eliminé mis espacios en blanco principales, mientras que Bryantrim.strings()
debajo (¡solo 1 voto, el mío!) Sí ...Para manipular el espacio en blanco, use str_trim () en el paquete stringr. El paquete tiene un manual con fecha del 15 de febrero de 2013 y está en CRAN. La función también puede manejar vectores de cadena.
(el crédito es para el comentarista: R. Cotton)
fuente
trimws()
no se pudieron eliminar.Una función simple para eliminar espacios en blanco iniciales y finales:
Uso:
fuente
ad1) Para ver espacios en blanco, puede llamar directamente
print.data.frame
con argumentos modificados:Ver también
?print.data.frame
para otras opciones.fuente
Use grep o grepl para encontrar observaciones con espacios en blanco y sub para deshacerse de ellos.
fuente
"^\\s+|\\s+$"
gsub
lugar desub
con la expresión regular de hadley. Consub
ella se tira espacios en blanco sólo si no hay espacios en blanco que lleva ...Prefiero agregar la respuesta como comentario al usuario56, pero aún así no puedo escribirlo como una respuesta independiente. La eliminación de espacios en blanco iniciales y finales también se puede lograr a través de la función trim () del paquete gdata:
Ejemplo de uso:
fuente
Otro problema relacionado ocurre si tiene múltiples espacios entre las entradas:
Luego puede dividir fácilmente esta cadena en tokens "reales" utilizando una expresión regular para el
split
argumento:Tenga en cuenta que si hay una coincidencia al comienzo de una cadena (no vacía), el primer elemento de la salida es '""', pero si hay una coincidencia al final de la cadena, la salida es la misma que con el partido eliminado.
fuente
Otra opción es usar la
stri_trim
función delstringi
paquete que por defecto elimina los espacios en blanco iniciales y finales:Para eliminar solo los espacios en blanco iniciales, use
stri_trim_left
. Para eliminar solo los espacios en blanco finales, usestri_trim_right
. Cuando desee eliminar otros caracteres iniciales o finales, debe especificar eso conpattern =
.Ver también
?stri_trim
para más información.fuente
Creé una
trim.strings ()
función para recortar espacios en blanco iniciales y / o finales como:Por ilustracion,
fuente
El mejor método es trimws ()
El siguiente código aplicará esta función a todo el marco de datos
fuente
df[] <- lapply(df, trimws)
para ser más compacto. Pero en ambos casos obligará a las columnas al carácter.df[sapply(df,is.character)] <- lapply(df[sapply(df,is.character)], trimws)
para estar seguro.Intenté recortar (). Funciona bien con espacios en blanco y con '\ n'. x = '\ n Endurecer, J. \ n'
recortar (x)
fuente
Después de esto, deberás forzar a R a no reconocer a "Austria" como un nivel. Supongamos que también tiene "Estados Unidos" y "España" como niveles:
Un poco menos intimidante que la respuesta más votada, pero aún así debería funcionar.
fuente