Como aparar o espaço em branco e arrastar?
-
20-09-2019 - |
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.
- 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 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.
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.