Come tagliare spazi iniziali e finali?
-
20-09-2019 - |
Domanda
Sto avendo alcuni problemi con spazi iniziali e finali in un data.frame.
Ad esempio, mi piace dare un'occhiata a un row
specifica in un data.frame
sulla base di una certa condizione:
> 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)
Mi chiedevo perché non ho avuto i risultati attesi in quanto il paese Austria ovviamente esisteva nella mia data.frame
. Dopo aver guardato attraverso la mia storia codice e cercando di capire cosa è andato storto ho provato:
> 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
Tutto quello che ho cambiato nel comando è un ulteriore spazio dopo l'Austria.
ovviamente sorgono ulteriori problemi fastidiosi. Ad esempio, quando mi piace di unire due frame in base alla colonna Paese. Uno data.frame
utilizza "Austria "
mentre l'altro telaio è "Austria"
. L'abbinamento non funziona.
- C'è un bel modo per 'show' lo spazio bianco sul mio schermo in modo che io sono a conoscenza del problema?
- E posso togliere la spazi iniziali e finali in R?
Finora ho usato per scrivere un semplice script Perl
che rimuove gli spazi, ma sarebbe bello se in qualche modo posso farlo all'interno R.
Soluzione
Probabilmente il modo migliore è quello di gestire i spazi bianchi di trascinamento quando si legge il file di dati. Se si utilizza read.csv
o read.table
è possibile impostare il parameterstrip.white=TRUE
.
Se si desidera pulire le stringhe in seguito è possibile utilizzare una di queste funzioni:
# 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)
Per usare una di queste funzioni sul myDummy$country
:
myDummy$country <- trim(myDummy$country)
Per 'show' lo spazio bianco è possibile utilizzare:
paste(myDummy$country)
che vi mostrerà le corde circondate da virgolette ( ") rendendo più facile da individuare spazi bianchi.
Altri suggerimenti
R 3.2.0 una nuova funzione è stata introdotta per rimuovere principali / spazi bianchi finali:
trimws()
Si veda: http: // stat. ethz.ch/R-manual/R-patched/library/base/html/trimws.html
Per manipolare lo spazio bianco, utilizzare str_trim () nel pacchetto stringr. Il pacchetto è manuale datato febbraio 15,2013 ed è in CRAN. La funzione può anche gestire vettori stringa.
install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)
(merito va al commentatore: R. Cotton)
Un semplice funzione per rimuovere spazi iniziali e finali:
trim <- function( x ) {
gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}
Utilizzo:
> text = " foo bar baz 3 "
> trim(text)
[1] "foo bar baz 3"
AD1) Per visualizzare gli spazi bianchi che si potrebbe chiamare direttamente print.data.frame
con argomenti modificati:
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"
Vedi ?print.data.frame
anche per altre opzioni.
Usare grep o Grepl per trovare osservazioni con spazi bianchi e sub per sbarazzarsi di loro.
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"
preferisco aggiungere la risposta come commento a user56 ma ancora in grado così la scrittura come una risposta indipendente. Rimozione spazi iniziali e finali potrebbe essere raggiunto attraverso rivestimento () funzione dal pacchetto gdata così:
require(gdata)
example(trim)
Esempio di utilizzo:
> trim(" Remove leading and trailing blanks ")
[1] "Remove leading and trailing blanks"
Un'altra opzione è quella di utilizzare la funzione stri_trim
dal pacchetto stringi
che per default rimuovere spazi iniziali e finali:
> x <- c(" leading space","trailing space ")
> stri_trim(x)
[1] "leading space" "trailing space"
Per la rimozione di solo spazi bianchi che porta, utilizzare stri_trim_left
. Per rimuovere solo spazio vuoto iniziale, utilizzare stri_trim_right
. Quando si desidera rimuovere altri personaggi iniziali o finali, è necessario specificare che con pattern =
.
Vedere anche ?stri_trim
per maggiori informazioni.
Un altro problema correlato si verifica se si dispone di più spazi ingressi trascorre:
> a <- " a string with lots of starting, inter mediate and trailing whitespace "
Si può quindi facilmente dividere questa stringa in "reale" gettoni usando un'espressione regolare per l'argomento split
:
> strsplit(a, split=" +")
[[1]]
[1] "" "a" "string" "with" "lots"
[6] "of" "starting," "inter" "mediate" "and"
[11] "trailing" "whitespace"
Si noti che se c'è una corrispondenza all'inizio del un (non vuota) stringa, il primo elemento della produzione è ‘ ''’, ma se v'è una corrispondenza alla fine della stringa, l'uscita è la stessa con la partita rimosso.
ho creato una funzione trim.strings ()
per tagliare leader e / o spazi finali come:
# 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)
}
}
Per l'illustrazione,
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"
Metodo migliore è trimws ()
A seguito di codice si applica questa funzione per tutta la dataframe
mydataframe <- data.frame (lapply (mydataframe, trimws), stringsAsFactors = FALSE)
ho provato assetto (). Funziona bene con spazi bianchi, nonché il '\ n'. x = '\ n Harden, J. \ n'
trim (x)
myDummy[myDummy$country == "Austria "] <- "Austria"
Dopo questo, è necessario forzare R non riconoscere "Austria" come un livello. Facciamo finta di avere anche "USA" e "Spagna", come i livelli:
myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))
Un po 'meno intimidatorio che il più alto votato risposta, ma dovrebbe funzionare.