Estou tendo alguns problemas com espaços em branco iniciais e finais em um data.frame. Por exemplo, eu gosto de dar uma olhada em um específico row
em um com 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
<0 rows> (or 0-length row.names)
Fiquei me perguntando por que não obtive a produção esperada desde que o país Áustria obviamente existia na minha 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 mudei no comando é um espaço em branco adicional após a Áustria.
Outros problemas irritantes obviamente surgem. Por exemplo, quando eu gosto de mesclar dois quadros com base na coluna do país. Um data.frame
usa "Austria "
enquanto o outro quadro tem "Austria"
. A correspondência não funciona.
- Existe uma boa maneira de 'mostrar' o espaço em branco na minha tela para que eu esteja ciente do problema?
- E posso remover o espaço em branco à esquerda e à direita no R?
Até agora, eu escrevia um Perl
script simples que remove o espaço em branco, mas seria bom se eu pudesse fazê-lo dentro de R.
fonte
sub()
usa aPerl
notação também. Me desculpe por isso. Vou tentar usar a função Mas, para minha primeira pergunta, ainda não tenho uma solução.Respostas:
Provavelmente, a melhor maneira é lidar com os espaços em branco à direita ao ler seu arquivo de dados. Se você usar
read.csv
ouread.table
você pode definir o parâmetrostrip.white=TRUE
.Se você quiser limpar as seqüências posteriormente, poderá usar uma destas funções:
Para usar uma dessas funções em
myDummy$country
:Para 'mostrar' o espaço em branco que você pode usar:
que mostra as seqüências de caracteres entre aspas ("), facilitando a identificação dos espaços em branco.
fonte
str_trim
nostringr
pacote.A partir do R 3.2.0, uma nova função foi introduzida para remover os espaços em branco à esquerda / à direita:
Veja: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html
fonte
\n
pertencer à classe de caracteres cobertos.trimws("SELECT\n blah\n FROM foo;")
ainda contém novas linhas.trimws
regex seja rápido o suficiente.stringr::str_trim
(com base emstringi
) também é interessante, pois usa uma biblioteca de strings internacionalizada completamente independente. Você pensaria que o espaço em branco estaria imune a problemas com a internacionalização, mas eu me pergunto. Eu nunca vi uma comparação de resultados de nativos vsstringr
/stringi
ou quaisquer benchmarks.trimws()
não remover meus principais espaços em branco, enquanto Bryantrim.strings()
abaixo (apenas 1 voto, meu!) Fez ...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 função também pode manipular vetores de string.
(o crédito vai para o comentarista: R. Cotton)
fonte
trimws()
não puderam ser removidos.Uma função simples para remover os espaços em branco iniciais e finais:
Uso:
fonte
ad1) Para ver espaços em branco, você pode chamar diretamente
print.data.frame
com argumentos modificados:Veja também
?print.data.frame
para outras opções.fonte
Use grep ou grepl para encontrar observações com espaços em branco e sub para se livrar deles.
fonte
"^\\s+|\\s+$"
gsub
vezsub
do regexp de hadley. Comsub
ele irá retirar espaços em branco somente se não há nenhum líder espaço em branco ...Prefiro adicionar a resposta como comentário ao user56, mas ainda assim não posso escrever como uma resposta independente. A remoção de espaços em branco à esquerda e à direita pode ser obtida através da função trim () do pacote gdata:
Exemplo de uso:
fonte
Outro problema relacionado ocorre se você tiver vários espaços entre as entradas:
Você pode facilmente dividir essa sequência em tokens "reais" usando uma expressão regular para o
split
argumento: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 que com a partida removida.
fonte
Outra opção é usar a
stri_trim
função dostringi
pacote cujo padrão é remover os espaços em branco iniciais e finais:Para remover apenas o espaço em branco à esquerda, use
stri_trim_left
. Para remover apenas o espaço em branco à direita, usestri_trim_right
. Quando você deseja remover outros caracteres iniciais ou finais, é necessário especificar isso compattern =
.Veja também
?stri_trim
para mais informações.fonte
Criei uma
trim.strings ()
função para aparar espaços em branco à esquerda e à direita como:Para ilustração,
fonte
O melhor método é trimws ()
O código a seguir aplicará essa função a todo o quadro de dados
fonte
df[] <- lapply(df, trimws)
para ser mais compacto. Mas, em ambos os casos, forçará colunas a caracteres.df[sapply(df,is.character)] <- lapply(df[sapply(df,is.character)], trimws)
estar seguro.Eu tentei aparar (). Funciona bem com espaços em branco e também com o '\ n'. x = '\ n Harden, J. \ n'
guarnição (x)
fonte
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:
Um pouco menos intimidador do que a resposta mais votada, mas ainda deve funcionar.
fonte