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.

  1. C'è un bel modo per 'show' lo spazio bianco sul mio schermo in modo che io sono a conoscenza del problema?
  2. 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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top