J'ai des problèmes avec les espaces blancs de début et de fin dans un data.frame. Par exemple, j'aime jeter un oeil à un spécifique row
dans une data.frame
base 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 la production attendue car le pays que l'Autriche existait évidemment dans mon pays 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 du pays. On data.frame
utilise "Austria "
alors que l'autre a "Austria"
. La correspondance ne fonctionne pas.
- Existe-t-il un bon moyen de «montrer» l'espace sur mon écran afin que je sois conscient du problème?
- Et puis-je supprimer les espaces blancs avant et arrière dans R?
Jusqu'à présent, j'avais l'habitude d'écrire un Perl
script simple qui supprime l'espace, mais ce serait bien si je pouvais le faire à l'intérieur de R.
sub()
laPerl
notation est également utilisée. Désolé pour ça. Je vais essayer d'utiliser la fonction. Mais pour ma première question, je n'ai pas encore de solution.Réponses:
La meilleure façon est probablement de gérer les espaces de fin lorsque vous lisez votre fichier de données. Si vous utilisez
read.csv
ouread.table
vous pouvez définir le paramètrestrip.white=TRUE
.Si vous souhaitez nettoyer les chaînes par la suite, vous pouvez utiliser l'une de ces fonctions:
Pour utiliser l'une de ces fonctions sur
myDummy$country
:Pour «montrer» l'espace blanc que vous pouvez utiliser:
qui vous montrera les chaînes entourées de guillemets (") facilitant la repérage des espaces.
la source
str_trim
dans lestringr
package.Depuis R 3.2.0, une nouvelle fonction a été introduite pour supprimer les espaces blancs avant / arrière:
Voir: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html
la source
\n
soit dans la classe des caractères couverts.trimws("SELECT\n blah\n FROM foo;")
contient toujours des nouvelles lignes.trimws
expression régulière est assez rapide.stringr::str_trim
(basé surstringi
) est également intéressant en ce qu'il utilise une bibliothèque de chaînes internationalisée complètement indépendante. On pourrait penser que les espaces blancs seraient à l'abri des problèmes d'internationalisation, mais je me demande. Je n'ai jamais vu de comparaison entre les résultats natifs etstringr
/stringi
ou les benchmarks.trimws()
n'a pas supprimé mes principaux espaces blancs, tandis que ceux de Bryantrim.strings()
ci - dessous (seulement 1 vote, le mien!) L'ont fait ...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 des vecteurs de chaîne.
(le mérite revient au commentateur: R. Cotton)
la source
trimws()
n'ont pas pu être supprimés.Une fonction simple pour supprimer les espaces blancs de début et de fin:
Usage:
la source
ad1) Pour voir les espaces blancs, vous pouvez appeler directement
print.data.frame
avec des arguments modifiés:Voir aussi
?print.data.frame
pour d'autres options.la source
Utilisez grep ou grepl pour trouver des observations avec des espaces blancs et sub pour vous en débarrasser.
la source
"^\\s+|\\s+$"
gsub
place desub
l'expression rationnelle de hadley. Avecsub
cela, les espaces de fin ne seront supprimés que s'il n'y a pas d'espaces de tête ...Je préfère ajouter la réponse en tant que commentaire à user56, mais je ne peux pas l'écrire comme une réponse indépendante. La suppression des blancs de début et de fin peut également être obtenue grâce à la fonction trim () du package gdata:
Exemple d'utilisation:
la source
Un autre problème connexe se produit si vous avez plusieurs espaces entre les entrées:
Vous pouvez ensuite facilement diviser cette chaîne en "vrais" jetons en utilisant une expression régulière à l'
split
argument: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 supprimé.
la source
Une autre option consiste à utiliser la
stri_trim
fonction dustringi
package qui par défaut supprime les espaces de début et de fin:Pour supprimer uniquement les espaces blancs de début, utilisez
stri_trim_left
. Pour supprimer uniquement les espaces de fin, utilisezstri_trim_right
. Lorsque vous souhaitez supprimer d'autres caractères de début ou de fin, vous devez spécifier cela avecpattern =
.Voir aussi
?stri_trim
pour plus d'informations.la source
J'ai créé une
trim.strings ()
fonction pour couper les espaces de début et / ou de fin comme:Pour illustration,
la source
La meilleure méthode est trimws ()
Le code suivant appliquera cette fonction à l'ensemble de la trame de données
la source
df[] <- lapply(df, trimws)
pour être plus compact. Mais dans les deux cas, il contraindra les colonnes à être personnalisées.df[sapply(df,is.character)] <- lapply(df[sapply(df,is.character)], trimws)
pour être sûr.J'ai essayé le trim (). Fonctionne bien avec les espaces blancs ainsi que le '\ n'. x = '\ n Harden, J. \ n'
garniture (x)
la source
Après cela, vous devrez forcer R à ne pas reconnaître "Autriche" comme niveau. Imaginons que vous ayez également "USA" et "Espagne" comme niveaux:
Un peu moins intimidant que la réponse la plus élevée, mais cela devrait quand même fonctionner.
la source