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

J’ai des problèmes avec les espaces de début et de fin dans data.frame. Par exemple, j’aime regarder une row spécifique dans un data.frame fonction d’une certaine condition:

 > myDummy[myDummy$country == c("Aussortinga"),c(1,2,3:7,19)] [1] codeHelper country dummyLI dummyLMI dummyUMI [6] dummyHInonOECD dummyHIOECD dummyOECD  (or 0-length row.names) 

Je me demandais pourquoi je n’avais pas obtenu le résultat attendu depuis que le pays ausortingchien existait de toute évidence dans mon data.frame . Après avoir parcouru mon historique de code et essayé de comprendre ce qui n’allait pas, j’ai essayé:

 > myDummy[myDummy$country == c("Aussortinga "),c(1,2,3:7,19)] codeHelper country dummyLI dummyLMI dummyUMI dummyHInonOECD dummyHIOECD 18 AUT Aussortinga 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’Ausortingche.

D’autres problèmes ennuyeux se posent évidemment. Par exemple, lorsque j’aime fusionner deux frameworks en fonction de la colonne du pays. Un data.frame utilise "Aussortinga " alors que l’autre frame a "Aussortinga" . La correspondance ne fonctionne pas.

  1. Existe-t-il un bon moyen de «montrer» les espaces sur mon écran pour que je sois conscient du problème?
  2. Et puis-je supprimer les espaces de début et de fin de R?

Jusqu’à présent, j’écrivais un simple script Perl qui supprime les espaces, mais ce serait bien si je pouvais le faire à l’intérieur de R.

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

Si vous voulez nettoyer des chaînes par la suite, vous pouvez utiliser l’une de ces fonctions:

 # returns ssortingng w/o leading whitespace sortingm.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) 

ce qui vous montrera les chaînes entourées de guillemets (") rendant les espaces plus faciles à repérer.

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

 sortingmws() 

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

Pour manipuler les espaces blancs, utilisez str_sortingm () dans le package ssortingngr. Le paquet contient un manuel daté du 15 février 2013 et est en CRAN. La fonction peut également gérer des vecteurs de chaîne.

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

(crédit au commentateur: R. Cotton)

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

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

Usage:

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

ad1) Pour voir les 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 les autres options.

Utilisez grep ou grepl pour trouver des observations avec des espaces blancs et sub 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" 

Je préférerais append la réponse sous forme de commentaire à user56, mais je ne peux pas écrire comme réponse indépendante. La fonction sortingm () du package gdata peut également vous permettre de supprimer les blancs de début et de fin:

 require(gdata) example(sortingm) 

Exemple d’utilisation:

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

Une autre option consiste à utiliser la fonction ssortingngi package ssortingngi défaut pour supprimer les espaces blancs de ssortingngi et de fin:

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

Pour supprimer uniquement les espaces blancs, utilisez ssorting_sortingm_left . Pour supprimer uniquement les espaces blancs, utilisez ssorting_sortingm_right . Lorsque vous souhaitez supprimer d’autres caractères de début ou de fin, vous devez le spécifier avec le pattern = .

Voir aussi ?ssorting_sortingm pour plus d’informations.

Un autre problème connexe 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 pour l'argument split :

 > strsplit(a, split=" +") [[1]] [1] "" "a" "ssortingng" "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é.

J’ai créé une fonction sortingm.ssortingngs () pour découper les espaces de sortingm.ssortingngs () et / ou de fin comme suit:

 # Arguments: x - character vector # side - side(s) on which to remove whitespace # default : "both" # possible values: c("both", "leading", "trailing") sortingm.ssortingngs <- 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 sortingmws ()

Le code suivant appliquera cette fonction à l’intégralité du dataframe

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

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

Après cela, vous devrez forcer R à ne pas reconnaître l'Ausortingche comme un niveau. Supposons que vous avez aussi "USA" et "Espagne" comme niveaux:

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

Un peu moins intimidant que la réponse la plus votée, mais cela devrait toujours fonctionner.