Question

J'ai quelques problèmes avec les espaces avant et dans un data.frame. Par exemple, j'aime jeter un oeil à un row spécifique dans un data.frame basé sur une certaine condition:

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

Je me demandais pourquoi je n'ai pas eu le résultat attendu puisque le pays Autriche évidemment existait dans mon data.frame. Après avoir regardé à travers mon histoire de code et en essayant de comprendre ce qui a mal tourné j'ai essayé:

> 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

Tout ce que j'ai changé dans la commande est un autre espace après l'Autriche.

D'autres problèmes se posent évidemment ennuyeux. Par exemple, quand j'aime fusionner deux images en fonction de la colonne de pays. Un data.frame utilise "Austria " tandis que l'autre cadre a "Austria". La correspondance ne fonctionne pas.

  1. Y at-il un bon moyen de « montrer » les espaces blancs sur mon écran de sorte que je suis conscient du problème?
  2. Et puis-je supprimer les espaces avant et en R?

Jusqu'à présent, je l'habitude d'écrire un script simple Perl qui supprime les espaces blancs, mais ce serait bien si je peux le faire en quelque sorte à l'intérieur R.

Était-ce utile?

La solution

Probablement la meilleure façon est de gérer les espaces blancs de suivi lorsque vous lisez votre fichier de données. Si vous utilisez read.csv ou read.table vous pouvez définir le parameterstrip.white=TRUE.

Si vous voulez nettoyer les chaînes après, vous pouvez utiliser une de ces fonctions:

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

Pour utiliser une de ces fonctions sur myDummy$country:

 myDummy$country <- trim(myDummy$country)

Pour 'montrer' les espaces blancs, vous pouvez utiliser:

 paste(myDummy$country)

qui vous montrera les chaînes entourées par des guillemets ( ") rend plus facile à repérer des espaces.

Autres conseils

de R 3.2.0 une nouvelle fonction a été introduite pour éliminer les grands espaces blancs / arrière:

trimws()

Voir: http: // stat. ethz.ch/R-manual/R-patched/library/base/html/trimws.html

Pour manipuler l'espace blanc, utilisez str_trim () dans le package stringr. Le paquet a manuel du février 15,2013 et est en CRAN. La fonction peut également gérer des vecteurs de chaîne.

install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)

(crédit va à commentateur: R. Cotton)

Une simple fonction pour supprimer les espaces avant et:

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

Utilisation:

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

AD1) Pour voir des espaces blancs, vous pouvez appeler directement print.data.frame avec des arguments modifiés:

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"

Voir aussi ?print.data.frame pour d'autres options.

Utilisez grep ou Grepl pour trouver des observations avec et sous pour espaces blancs se débarrasser d'eux.

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"  

Je préfère ajouter la réponse comme commentaire à user56 mais encore incapable d'écrire de façon indépendante une réponse. Retrait d'attaque et de fuite des blancs peut être réalisée grâce à la fonction trim () du paquet gdata ainsi:

require(gdata)
example(trim)

Exemple d'utilisation:

> trim("   Remove leading and trailing blanks    ")
[1] "Remove leading and trailing blanks"

Une autre option consiste à utiliser la fonction de stri_trim à partir du paquet stringi qui par défaut pour retirer espaces avant et après:

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

Pour que la suppression principale espaces, utilisez stri_trim_left. Pour seulement enlever les espaces de fin, utilisez stri_trim_right. Lorsque vous souhaitez supprimer d'autres caractères avant ou arrière, vous devez spécifier avec pattern =.

Voir aussi ?stri_trim pour plus d'informations.

Un autre problème lié se produit si vous avez plusieurs espaces entrées inbetween:

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

Vous pouvez alors facilement diviser cette chaîne en « vrai » jetons en utilisant une expression régulière pour l'argument split:

> strsplit(a, split=" +")
[[1]]
 [1] ""           "a"          "string"     "with"       "lots"      
 [6] "of"         "starting,"  "inter"      "mediate"    "and"       
[11] "trailing"   "whitespace"

Notez que s'il y a un match au début de une chaîne (non vide), le premier élément de la sortie est « « » », mais s'il y a une correspondance à la fin de la chaîne, la sortie est la même que pour le match enlevé.

J'ai créé une fonction trim.strings () pour couper la direction et / ou de fin des espaces, comme:

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

Pour illustration,

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"   

meilleure méthode est trimws ()

code suivant appliquera cette fonction à dataframe ensemble

  

mydataframe <- data.frame (lapply (mydataframe, trimws), stringsAsFactors = FALSE)

J'ai essayé trim (). Fonctionne bien avec des espaces blancs, ainsi que le « \ n ». x = '\ n Harden, J. \ n'

trim (x)

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

Après cela, vous devrez forcer R de ne pas reconnaître « l'Autriche » comme niveau. Disons que vous avez également prétendre « USA » et « Espagne » que les niveaux:

myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))

Un peu moins intimidante que la réponse a voté plus haut, mais il faut encore travailler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top