Pregunta

Tengo algunos problemas con los espacios en blanco iniciales y finales en un marco de datos.Por ejemplo, me gusta echar un vistazo a un tema específico. row en un data.frame basado en 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 el resultado esperado ya que el país Austria obviamente existía en mi país. data.frame.Después de revisar mi historial de código y tratar de descubrir 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.

Evidentemente surgen otros problemas molestos.Por ejemplo, cuando me gusta fusionar dos cuadros según la columna del país.Uno data.frame usos "Austria " mientras que el otro cuadro tiene "Austria".La coincidencia no funciona.

  1. ¿Existe una buena manera de "mostrar" los espacios en blanco en mi pantalla para que esté al tanto del problema?
  2. ¿Y puedo eliminar los espacios en blanco iniciales y finales en R?

Hasta ahora solía escribir un simple Perl script que elimina los espacios en blanco, pero sería bueno si de alguna manera pudiera hacerlo dentro de R.

¿Fue útil?

Solución

Probablemente la mejor manera es manejar los espacios en blanco se arrastran cuando se lee el archivo de datos. Si utiliza read.csv o read.table puede establecer el parameterstrip.white=TRUE.

Si desea limpiar las cuerdas después usted podría utilizar una de estas funciones:

# returns string w/o leading whitespace
trim.leading <- function (x)  sub("^\\s+", "", x)

# returns string w/o trailing whitespace
trim.trailing <- function (x) sub("\\s+$", "", x)

# returns string w/o leading or trailing whitespace
trim <- function (x) gsub("^\\s+|\\s+$", "", x)

Para utilizar una de estas funciones en myDummy$country:

 myDummy$country <- trim(myDummy$country)

Para 'mostrar' el espacio en blanco se puede utilizar:

 paste(myDummy$country)

que le mostrará las cadenas delimitadas por comillas ( ") haciendo más fácil de detectar espacios en blanco.

Otros consejos

A partir de R 3.2.0 se introdujo una nueva función para la eliminación de los principales espacios en blanco / de arrastre:

trimws()

Ver: http: // stat. ethz.ch/R-manual/R-patched/library/base/html/trimws.html

Para manipular el espacio en blanco, utilice str_trim () en el paquete stringr. El paquete ha salido con manual de febrero 15,2013 y está en CRAN. La función también puede manejar vectores de cadenas.

install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)

(crédito va a comentarista: R. algodón)

A función simple para eliminar espacio inicial y final:

trim <- function( x ) {
  gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}

Uso:

> text = "   foo bar  baz 3 "
> trim(text)
[1] "foo bar  baz 3"

AD1) Para ver los espacios en blanco que se podría llamar directamente print.data.frame con argumentos modificados:

print(head(iris), quote=TRUE)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width  Species
# 1        "5.1"       "3.5"        "1.4"       "0.2" "setosa"
# 2        "4.9"       "3.0"        "1.4"       "0.2" "setosa"
# 3        "4.7"       "3.2"        "1.3"       "0.2" "setosa"
# 4        "4.6"       "3.1"        "1.5"       "0.2" "setosa"
# 5        "5.0"       "3.6"        "1.4"       "0.2" "setosa"
# 6        "5.4"       "3.9"        "1.7"       "0.4" "setosa"

Ver también ?print.data.frame para otras opciones.

Utilice grep o Grepl encontrar observaciones con espacios en blanco y sub para deshacerse de ellos.

names<-c("Ganga Din\t","Shyam Lal","Bulbul ")
grep("[[:space:]]+$",names)
[1] 1 3
grepl("[[:space:]]+$",names)
[1]  TRUE FALSE  TRUE
sub("[[:space:]]+$","",names)
[1] "Ganga Din" "Shyam Lal" "Bulbul"  

Yo prefiero añadir la respuesta como comentario a user56 pero aún no por lo que escribir como una respuesta independiente. función Extracción de ataque y de salida espacios en blanco se podría lograr a través de trim () de paquete gdata así:

require(gdata)
example(trim)

Ejemplo de uso:

> trim("   Remove leading and trailing blanks    ")
[1] "Remove leading and trailing blanks"

Otra opción es utilizar la función de stri_trim del paquete stringi que por defecto es la eliminación de espacio inicial y final:

> x <- c("  leading space","trailing space   ")
> stri_trim(x)
[1] "leading space"  "trailing space"

Para eliminar solamente el espacio al principio, utilizar stri_trim_left. Para la eliminación de solamente espacios en blanco finales, utilice stri_trim_right. Cuando se desea eliminar otros caracteres iniciales o finales, hay que especificar que con pattern =.

Véase también ?stri_trim para obtener más información.

Otro problema relacionado ocurre si tiene múltiples espacios entre medio de entradas:

> a <- "  a string         with lots   of starting, inter   mediate and trailing   whitespace     "

A continuación, puede fácilmente dividir esta cadena en "real" fichas usando una expresión regular para el argumento split:

> strsplit(a, split=" +")
[[1]]
 [1] ""           "a"          "string"     "with"       "lots"      
 [6] "of"         "starting,"  "inter"      "mediate"    "and"       
[11] "trailing"   "whitespace"

Tenga en cuenta que si hay un partido en el inicio de una cadena (no vacío), el primer elemento de la salida es ‘ ''’, pero si hay un partido en el final de la cadena, la salida es la mismo que con el partido eliminado.

He creado una función trim.strings () para recortar líder y / o espacios en blanco como:

# Arguments:    x - character vector
#            side - side(s) on which to remove whitespace 
#                   default : "both"
#                   possible values: c("both", "leading", "trailing")

trim.strings <- function(x, side = "both") { 
    if (is.na(match(side, c("both", "leading", "trailing")))) { 
      side <- "both" 
      } 
    if (side == "leading") { 
      sub("^\\s+", "", x)
      } else {
        if (side == "trailing") {
          sub("\\s+$", "", x)
    } else gsub("^\\s+|\\s+$", "", x)
    } 
} 

Para ilustración,

a <- c("   ABC123 456    ", " ABC123DEF          ")

# returns string without leading and trailing whitespace
trim.strings(a)
# [1] "ABC123 456" "ABC123DEF" 

# returns string without leading whitespace
trim.strings(a, side = "leading")
# [1] "ABC123 456    "      "ABC123DEF          "

# returns string without trailing whitespace
trim.strings(a, side = "trailing")
# [1] "   ABC123 456" " ABC123DEF"   

mejor método es trimws ()

Tras código se aplicará esta función para toda trama de datos

  

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

He intentado trim (). Funciona bien con espacios en blanco, así como el '\ n'. x = '\ n Harden, J. \ n'

recortar (x)

myDummy[myDummy$country == "Austria "] <- "Austria"

Después de esto, tendrá que forzar R no reconocer "Austria" como un nivel. Vamos a suponer que usted también tiene "EE.UU." y "España" como los niveles:

myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))

Un poco menos intimidante que la respuesta con más votos, pero aún así debería funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top