Comment couper les espaces avant et?
-
20-09-2019 - |
Question
J'ai quelques problèmes avec les espaces avant et dans un data.frame.
Par exemple, j'aime jeter un oeil à 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'ai pas eu le résultat attendu puisque le pays Autriche évidemment existait dans mon data.frame
. Après avoir regardé à travers mon histoire de code et en essayant de comprendre ce qui a mal tourné 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 autre espace après l'Autriche.
D'autres problèmes se posent évidemment ennuyeux. Par exemple, quand j'aime fusionner deux images en fonction de la colonne de pays. Un data.frame
utilise "Austria "
tandis que l'autre cadre a "Austria"
. La correspondance ne fonctionne pas.
- Y at-il un bon moyen de « montrer » les espaces blancs sur mon écran de sorte que je suis conscient du problème?
- Et puis-je supprimer les espaces avant et en R?
Jusqu'à présent, je l'habitude d'écrire un script simple Perl
qui supprime les espaces blancs, mais ce serait bien si je peux le faire en quelque sorte à l'intérieur R.
La solution
Probablement la meilleure façon est de gérer les espaces blancs de suivi lorsque vous lisez votre fichier de données. Si vous utilisez read.csv
ou read.table
vous pouvez définir le parameterstrip.white=TRUE
.
Si vous voulez nettoyer les chaînes après, vous pouvez utiliser 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' les espaces blancs, vous pouvez utiliser:
paste(myDummy$country)
qui vous montrera les chaînes entourées par des guillemets ( ") rend plus facile à repérer des espaces.
Autres conseils
de R 3.2.0 une nouvelle fonction a été introduite pour éliminer les grands espaces blancs / arrière:
trimws()
Voir: http: // stat. ethz.ch/R-manual/R-patched/library/base/html/trimws.html
Pour manipuler l'espace blanc, utilisez str_trim () dans le package stringr. Le paquet a manuel du février 15,2013 et est en CRAN. La fonction peut également gérer des vecteurs de chaîne.
install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)
(crédit va à commentateur: R. Cotton)
Une simple fonction pour supprimer les espaces avant et:
trim <- function( x ) {
gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}
Utilisation:
> text = " foo bar baz 3 "
> trim(text)
[1] "foo bar baz 3"
AD1) Pour voir des 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 d'autres options.
Utilisez grep ou Grepl pour trouver des observations avec et sous pour espaces blancs se débarrasser d'eux.
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ère ajouter la réponse comme commentaire à user56 mais encore incapable d'écrire de façon indépendante une réponse. Retrait d'attaque et de fuite des blancs peut être réalisée grâce à la fonction trim () du paquet gdata ainsi:
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 de stri_trim
à partir du paquet stringi
qui par défaut pour retirer espaces avant et après:
> x <- c(" leading space","trailing space ")
> stri_trim(x)
[1] "leading space" "trailing space"
Pour que la suppression principale espaces, utilisez stri_trim_left
. Pour seulement enlever les espaces de fin, utilisez stri_trim_right
. Lorsque vous souhaitez supprimer d'autres caractères avant ou arrière, vous devez spécifier avec pattern =
.
Voir aussi ?stri_trim
pour plus d'informations.
Un autre problème lié se produit si vous avez plusieurs espaces entrées inbetween:
> a <- " a string with lots of starting, inter mediate and trailing whitespace "
Vous pouvez alors facilement diviser cette chaîne en « vrai » jetons en utilisant une expression régulière pour 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 y a un match au début de 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 pour le match enlevé.
J'ai créé une fonction trim.strings ()
pour couper la direction et / ou de fin des espaces, 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"
meilleure méthode est trimws ()
code suivant appliquera cette fonction à dataframe ensemble
mydataframe <- data.frame (lapply (mydataframe, trimws), stringsAsFactors = FALSE)
J'ai essayé trim (). Fonctionne bien avec des espaces blancs, ainsi que le « \ n ». x = '\ n Harden, J. \ n'
trim (x)
myDummy[myDummy$country == "Austria "] <- "Austria"
Après cela, vous devrez forcer R de ne pas reconnaître « l'Autriche » comme niveau. Disons que vous avez également prétendre « USA » et « Espagne » que les niveaux:
myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))
Un peu moins intimidante que la réponse a voté plus haut, mais il faut encore travailler.