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.
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.
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.
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
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)
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"
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.
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"
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"
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.
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.
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"
J'ai essayé trim (). Fonctionne bien avec les espaces blancs ainsi que le '\ n'. x = '\ n Harden, J.\n'
trim (x)
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)
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.