web-dev-qa-db-fra.com

Comment couper les espaces de début et de fin?

J'ai quelques problèmes avec les espaces de début et de fin dans un fichier data.frame. Par exemple, j'aime jeter un oeil sur 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'obtenais pas le résultat attendu puisque le pays Autriche existait évidemment dans mon data.frame. Après avoir parcouru l'historique de mon code et essayé de comprendre ce qui n'allait pas, 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 cadres en fonction de la colonne pays. Un data.frame utilise "Austria " tandis que l'autre image contient "Austria". La correspondance ne fonctionne pas.

  1. Y at-il un bon moyen de "montrer" les espaces sur mon écran pour que je sois au courant du problème?
  2. Et puis-je supprimer les espaces de début et de fin dans R?

Jusqu'ici, j'avais l'habitude d'écrire un simple script Perl qui supprime les espaces, mais ce serait bien si je pouvais le faire d'une manière ou d'une autre à l'intérieur de R.

339
mropa

Le meilleur moyen est probablement de gérer les espaces finaux lorsque vous lisez votre fichier de données. Si vous utilisez read.csv ou read.table, vous pouvez définir le paramètrestrip.white=TRUE.

Si vous souhaitez nettoyer les chaînes ultérieurement, vous pouvez utiliser l'une des fonctions suivantes:

# 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 l'une de ces fonctions sur myDummy$country:

 myDummy$country <- trim(myDummy$country)

Pour "afficher" les espaces que vous pouvez utiliser:

 paste(myDummy$country)

qui vous montrera les chaînes entourées de guillemets (") facilitant la détection des espaces.

441
f3lix

A partir de R 3.2.0, une nouvelle fonction a été introduite pour supprimer les espaces blancs de début/fin:

trimws()

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

497
wligtenberg

Pour manipuler les espaces, 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 revient au commentateur: R. Cotton)

85
userJT

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

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

tilisation:

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

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.

11
Marek

Utilisez grep ou grepl pour rechercher des observations avec des espaces et 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"  
9

Je préférerais ajouter la réponse sous forme de commentaire à user56, mais je n'ai pas pu l'écrire de manière indépendante. La suppression des blancs de début et de fin peut également être réalisée via la fonction trim () du paquetage gdata:

require(gdata)
example(trim)

Exemple d'utilisation:

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

Une autre option consiste à utiliser la fonction stri_trim du package stringi qui, par défaut, supprime les espaces de début et de fin:

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

Pour ne supprimer que les espaces, utilisez stri_trim_left. Pour ne supprimer que les espaces finaux, utilisez stri_trim_right. Lorsque vous souhaitez supprimer d'autres caractères de début ou de fin, vous devez le spécifier avec pattern =.

Voir aussi ?stri_trim pour plus d'informations.

5
Jaap

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 scinder cette chaîne en "vrais" jetons à l'aide d'une expression régulière à 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 existe une correspondance au début d'une chaîne (non vide), le premier élément de la sortie est '""', mais s'il existe une correspondance à la fin de la chaîne, la sortie est la même que avec l'allumette enlevée.

4
TMOTTM

J'ai créé une fonction trim.strings () pour couper les espaces de début et 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"   
2
Bryan

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

trim (x)

1
J.Dan

La meilleure méthode est trimws ()

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

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

1
Santosh Kadge
myDummy[myDummy$country == "Austria "] <- "Austria"

Après cela, vous devrez forcer R à ne pas reconnaître "Autriche" en tant que niveau. Supposons que vous avez également "USA" et "Espagne" en tant que niveaux:

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

Un peu moins intimidant que la réponse la plus votée, mais cela devrait quand même fonctionner.

0
David Mitchell