349 votes

entre les extrémités de tête et de queue

Je vais avoir quelques problèmes avec attaque et de fuite des espaces dans un ensemble de données.cadre. Par exemple, je voudrais prendre un coup d'oeil à un certain row en 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 obtenu le résultat attendu depuis que le pays Autriche évidemment existait dans mon data.frame. Après avoir cherché dans mon code à l'histoire et à essayer 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 supplémentaire est un espace après l'Autriche.

Plus ennuyeux évidemment des problèmes surviennent. Par exemple, quand j'aime pour fusionner les deux images sur la base du pays de la colonne. Un data.frame utilise "Austria " , tandis que l'autre cadre a "Austria". Le correspondant ne fonctionne pas.

  1. Est-il une bonne façon de "montrer" l'espace sur mon écran alors que je suis au courant du problème?
  2. Et puis-je retirer de l'attaque et de fuite des espaces dans des R?

Jusqu'à présent j'ai utilisé pour écrire une simple Perl script qui supprime les espaces blancs, mais ce serait bien si je peux en quelque sorte le faire à l'intérieur de R.

450voto

f3lix Points 13634

Probablement la meilleure façon est de gérer la fuite des espaces 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 voulez nettoyer les chaînes ensuite, vous 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" l'espace, vous pouvez utiliser:

 paste(myDummy$country)

qui vous montrera les chaînes de caractères entourée par des guillemets ( " ), offrant des espaces plus facile à repérer.

87voto

user56 Points 659

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)

23voto

Bernhard Kausler Points 1371

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"
 

11voto

Marek Points 18000

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

9voto

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"  
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X