Como aparar espaços em branco iniciais e finais?

Estou tendo alguns problemas com espaço em branco inicial e final em um data.frame. Por exemplo, eu gostaria de ver uma row específica em um data.frame base em uma determinada condição:

 > myDummy[myDummy$country == c("Austria"),c(1,2,3:7,19)] [1] codeHelper country dummyLI dummyLMI dummyUMI [6] dummyHInonOECD dummyHIOECD dummyOECD  (or 0-length row.names) 

Eu estava me perguntando por que eu não recebi a saída esperada desde que o país Áustria obviamente existia no meu data.frame . Depois de examinar meu histórico de códigos e tentar descobrir o que deu errado, tentei:

 > 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 

Tudo o que eu mudei no comando é um espaço adicional adicional depois da Áustria.

Mais problemas irritantes surgem obviamente. Por exemplo, quando eu gosto de mesclar dois frameworks com base na coluna do país. Um data.frame usa "Austria " enquanto o outro quadro tem "Austria" . A correspondência não funciona.

  1. Existe uma boa maneira de “mostrar” o espaço em branco na minha canvas para que eu esteja ciente do problema?
  2. E posso remover o espaço em branco inicial e final em R?

Até agora eu costumava escrever um script Perl simples, que remove o espaço em branco, mas seria bom se eu pudesse de alguma forma fazê-lo dentro de R.

Provavelmente, a melhor maneira é manipular os espaços em branco finais quando você lê o arquivo de dados. Se você usar read.csv ou read.table poderá definir o parâmetro strip.white=TRUE .

Se você quiser limpar as strings depois, você pode usar uma destas funções:

 # 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 uma dessas funções no myDummy$country :

  myDummy$country <- trim(myDummy$country) 

Para "mostrar" o espaço em branco que você poderia usar:

  paste(myDummy$country) 

que mostrará as strings entre aspas ("), tornando os espaços em branco mais fáceis de detectar.

A partir da R 3.2.0, foi introduzida uma nova function para remover os espaços em branco iniciais / finais:

 trimws() 

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

Para manipular o espaço em branco, use str_trim () no pacote stringr. O pacote tem manual datado de 15 de fevereiro de 2013 e está no CRAN. A function também pode manipular vetores de string.

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

(crédito vai para comentarista: R. Cotton)

Uma function simples para remover espaços em branco iniciais e finais:

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

Uso:

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

ad1) Para ver os espaços em branco, você poderia chamar diretamente print.data.frame com 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" 

Veja também ?print.data.frame para outras opções.

Use grep ou grepl para encontrar observações com espaços em branco e sub para se livrar deles.

 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" 

Eu preferiria adicionar a resposta como comentário ao user56, mas ainda assim incapaz de escrever como uma resposta independente. A remoção de espaços em branco iniciais e finais pode ser obtida também através da function trim () do pacote gdata:

 require(gdata) example(trim) 

Exemplo de uso:

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

Outra opção é usar a function stringi pacote stringi , cujo padrão é remover espaços em branco à esquerda e à direita:

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

Para remover apenas os espaços em branco stri_trim_left , use stri_trim_left . Para remover apenas espaços em branco à direita, use stri_trim_right . Quando você deseja remover outros caracteres iniciais ou finais, é necessário especificar isso com pattern = .

Veja também ?stri_trim para mais informações.

Outro problema relacionado ocorre se você tiver vários espaços entre as inputs:

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

Você pode então facilmente dividir essa string em tokens "reais" usando uma expressão regular para o argumento split :

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

Observe que, se houver uma correspondência no início de uma sequência (não vazia), o primeiro elemento da saída será '""', mas se houver uma correspondência no final da sequência, a saída será a mesma com o jogo removido.

Eu criei uma function trim.strings () para aparar espaço em branco inicial e / ou final 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 ilustração,

 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" 

O melhor método é o trimws ()

O código a seguir aplicará essa function a todo o dataframe

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

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

Depois disso, você precisará forçar R a não reconhecer "Áustria" como um nível. Vamos fingir que você também tem "EUA" e "Espanha" como níveis:

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

Um pouco menos intimidante do que a resposta mais votada, mas ainda deve funcionar.