Pergunta

Estou tendo alguns problemas com o espaço de branco liderando e arrastando em um dado.frame. Por exemplo, eu gosto de dar uma olhada em um específico row em um data.frame Com base em uma certa condição:

> 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)

Eu queria saber por que não obtive a produção esperada, já que o país a Áustria obviamente existia no meu data.frame. Depois de examinar meu histórico de código 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 mudei no comando é um espaço em branco depois da Áustria.

Outros problemas irritantes obviamente surgem. Por exemplo, quando gosto de mesclar dois quadros com base na coluna do país. Um data.frame usos "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 tela para que eu esteja ciente do problema?
  2. E posso remover o espaço em branco e arrastar em R?

Até agora eu costumava escrever um simples Perl Script que remove o espaço em branco, mas seria bom se eu pudesse de alguma forma fazer isso dentro de R.

Foi útil?

Solução

Provavelmente, a melhor maneira é lidar com os espaços de branco à direita ao ler seu arquivo de dados. Se você usar read.csv ou read.table você pode definir o parâmetrostrip.white=TRUE.

Se você quiser limpar as cordas depois, poderá usar uma dessas 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 em myDummy$country:

 myDummy$country <- trim(myDummy$country)

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

 paste(myDummy$country)

O que mostrará as cordas cercadas por aspas ("), facilitando a identificação dos espaços em branco.

Outras dicas

A partir de r 3.2.0, uma nova função foi introduzida para remover os espaços de braçadeira de liderança/à direita:

trimws()

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

Para manipular o espaço branco, use str_trim () no pacote Stringr. O pacote tem manual de 15 de fevereiro de 2013 e está em cran. A função também pode lidar com 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)

Um simples função Para remover o espaço em branco à frente e à direita:

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

Uso:

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

ad1) para ver espaços brancos que você poderia ligar 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 -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 prefiro adicionar a resposta como comentário ao usuário56, mas ainda não consegue escrever como uma resposta independente. A remoção de espaços em branco de destaque e arrasto também pode ser alcançada através da função 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 o stri_trim função do stringi Pacote que padroniza para remover o espaço em branco principal e à direita:

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

Para remover apenas o espaço em branco, use stri_trim_left. Para remover apenas o espaço em branco, use stri_trim_right. Quando você deseja remover outros personagens principais ou à direita, você deve 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 entradas:

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

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

> 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 string (não vazia), o primeiro elemento da saída é '""', mas se houver uma correspondência no final da string, a saída é a mesma que com a partida removida.

Eu criei um trim.strings () Função para aparar o espaço de branco principal e/ou à direita 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 é Trimws ()

O código a seguir aplicará esta função a todo o quadro

mydataframe <- data.frame (lapply (mydataframe, trimws), stringsafactors = false)

Eu tentei Trim (). Funciona bem com espaços brancos, bem como os ' n'. x = ' n Harden, J. n'

Trim (x)

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

Depois disso, você precisará forçar r a não reconhecer a "Á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 intimidador do que a resposta mais alta, mas ainda deve funcionar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top