taille - titre histogramme r




Comment couper les espaces de début et de fin dans R? (8)

A partir de R 3.2.0, une nouvelle fonction a été introduite pour supprimer les espaces blancs avant / arrière:

trimws()

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

J'ai quelques problèmes avec les espaces de début et de fin dans un data.frame. Par exemple, j'aime regarder une row spécifique dans un data.frame fonction d'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'obtenais pas la sortie attendue puisque le pays Autriche existait évidemment dans mon data.frame . Après avoir regardé mon histoire de code et essayant de comprendre ce qui s'est mal passé 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 espace supplémentaire après l'Autriche.

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

  1. Existe-t-il un moyen agréable de «montrer» les espaces sur mon écran afin que je sois conscient du problème?
  2. Puis-je supprimer les espaces de début et de fin dans R?

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


J'ai créé une fonction trim.strings () pour couper les espaces de trim.strings () et / ou de fin 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"   

La meilleure méthode est trimws ()

Le code suivant appliquera cette fonction à l'ensemble de l'ensemble de données

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


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

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

(Le crédit va à l'intervenant: R. Cotton)


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

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

Vous pouvez ensuite facilement diviser cette chaîne en "vrais" jetons en utilisant une expression régulière à l'argument de 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 une correspondance au début d'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 avec le match enlevé.


Une fonction simple pour supprimer les espaces de début et de fin:

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

Usage:

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

Utilisez grep ou grepl pour trouver des observations avec des espaces et des sous pour les supprimer.

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"  

ad1) Pour voir les espaces blancs, vous pouvez directement appeler 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.





built-in