español - ¿Cómo recortar los espacios en blanco iniciales y finales?
manual de navisworks 2018 en español pdf (13)
Tengo algunos problemas con los espacios en blanco iniciales y finales en un data.frame. Por ejemplo, me gusta echar un vistazo a una row
específica 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 la salida esperada ya que el país Austria obviamente existía en mi data.frame
. Después de revisar el historial de mi código e intentar averiguar qué salió mal, lo 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.
Otros problemas molestos obviamente surgen. Por ejemplo, cuando me gusta combinar dos marcos basados en la columna de país. Un data.frame
usa "Austria "
mientras que el otro frame tiene "Austria"
. El emparejamiento no funciona.
- ¿Hay una buena manera de "mostrar" los espacios en blanco en mi pantalla para que yo esté al tanto del problema?
- ¿Y puedo eliminar los espacios en blanco iniciales y finales en R?
Hasta ahora solía escribir un simple script de Perl
que elimina el espacio en blanco, pero sería bueno si pudiera hacerlo dentro de R.
A partir de la R 3.2.0 se introdujo una nueva función para eliminar los espacios en blanco iniciales / finales:
trimws()
Consulte: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html
El mejor método es trimws ()
El siguiente código aplicará esta función a todo el marco de datos
mydataframe <- data.frame (lapply (mydataframe, trimws), cadenasAsFactors = FALSE)
Intenté recortar (). Funciona bien con espacios en blanco, así como el ''/ n''. x = ''/ n Harden, J. / n''
recortar (x)
Otra opción es usar la función stringi
paquete stringi
, que de manera predeterminada elimina los espacios en blanco stringi
y finales:
> x <- c(" leading space","trailing space ")
> stri_trim(x)
[1] "leading space" "trailing space"
Para eliminar solo los espacios en blanco stri_trim_left
, use stri_trim_left
. Para eliminar solo los espacios en blanco al final, use stri_trim_right
. Cuando desee eliminar otros caracteres iniciales o finales, debe especificar eso con el pattern =
.
Vea también ?stri_trim
para más información.
Otro problema relacionado ocurre si tiene múltiples espacios entre las entradas:
> a <- " a string with lots of starting, inter mediate and trailing whitespace "
Luego, puede dividir fácilmente esta cadena en tokens "reales" usando una expresión regular para el argumento de 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 una coincidencia al principio 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.
Para manipular el espacio en blanco, use str_trim () en el paquete stringr. El paquete tiene manual con fecha del 15 de febrero de 2013 y está en CRAN. La función también puede manejar vectores de cadena.
install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)
(El crédito es para el comentarista: R. Cotton)
Preferiría agregar la respuesta como comentario al usuario56 pero aún así no puedo escribirla como una respuesta independiente. La eliminación de los espacios en blanco iniciales y finales se puede lograr también a través de la función trim () del paquete gdata:
require(gdata)
example(trim)
Ejemplo de uso:
> trim(" Remove leading and trailing blanks ")
[1] "Remove leading and trailing blanks"
Probablemente, la mejor manera es manejar los espacios en blanco finales al leer su archivo de datos. Si usa read.csv
o read.table
puede establecer el parámetro strip.white=TRUE
.
Si desea limpiar cadenas después, puede usar 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 usar 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 entre comillas (") haciendo que los espacios en blanco sean más fáciles de detectar.
Una función simple para eliminar los espacios en blanco iniciales y finales:
trim <- function( x ) {
gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}
Uso:
> text = " foo bar baz 3 "
> trim(text)
[1] "foo bar baz 3"
Usa grep o grepl para encontrar observaciones con espacios en blanco y sub para deshacerte 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"
ad1) Para ver espacios en blanco puede llamar directamente a 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"
Vea también ?print.data.frame
para otras opciones.
trim.strings ()
una función trim.strings ()
para recortar espacios en blanco trim.strings ()
y / o finales 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)
}
}
Por ilustracion,
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"
myDummy[myDummy$country == "Austria "] <- "Austria"
Después de esto, tendrás que forzar a R a no reconocer "Austria" como un nivel. Supongamos que también tiene "USA" y "España" como niveles:
myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))
Un poco menos intimidante que la respuesta más votada, pero aún debería funcionar.