J'ai un fichier csv où certaines des valeurs numériques sont exprimées sous forme de chaînes avec des virgules comme séparateur de milliers, par exemple "1,513"
au lieu de 1513
. Quelle est la manière la plus simple de lire les données dans R?
Je peux utiliser read.csv(..., colClasses="character")
, mais je dois ensuite supprimer les virgules des éléments pertinents avant de convertir ces colonnes en colonnes numériques, et je ne trouve pas de moyen efficace de le faire.
setAs("character", "logical.Y.N", function(from) c(Y=TRUE,N=FALSE)[from] )
).setClass("num.with.commas")
ousuppresMessage(setAs(.....))
pour éviter le message sur la classe manquante.Je souhaite utiliser R plutôt que prétraiter les données, car cela facilite la révision des données. Suite à la suggestion d'utilisation de Shane
gsub
, je pense que c'est à peu près aussi net que je peux le faire:la source
Cette question date de plusieurs années, mais je suis tombée dessus, ce qui signifie que d'autres le feront peut-être.
La
readr
bibliothèque / package a quelques fonctionnalités intéressantes. L'une d'elles est une manière agréable d'interpréter des colonnes «désordonnées», comme celles-ci.Cela donne
Source: trame de données locale [4 x 1]
Un point important lors de la lecture de fichiers: soit vous devez pré-traiter, comme le commentaire ci-dessus concernant
sed
, soit vous devez traiter pendant la lecture . Souvent, si vous essayez de réparer les choses après coup, certaines suppositions dangereuses sont difficiles à trouver. (C'est pourquoi les fichiers plats sont si mauvais en premier lieu.)Par exemple, si je n'avais pas signalé le
col_types
, j'aurais obtenu ceci:(Notez que c'est maintenant un
chr
(character
) au lieu d'unnumeric
.)Ou, plus dangereusement, s'il était assez long et que la plupart des premiers éléments ne contenaient pas de virgules:
(tel que les derniers éléments ressemblent à :)
Ensuite, vous aurez du mal à lire cette virgule!
la source
une
dplyr
solution utilisantmutate_all
et des tuyauxdites que vous avez ce qui suit:
et souhaitez supprimer les virgules des variables année X2014-X2016 et les convertir en numérique. aussi, disons que X2014-X2016 sont lus comme des facteurs (par défaut)
mutate_all
applique la (les) fonction (s) à l'intérieurfuns
aux colonnes spécifiéesJe l'ai fait séquentiellement, une fonction à la fois (si vous utilisez plusieurs fonctions à l'intérieur,
funs
vous créez des colonnes supplémentaires et inutiles)la source
mutate_each
est obsolète. Voulez-vous mettre à jour votre réponse avecmutate_at
ou similaire?"Prétraitement" dans R:
Peut utiliser
readLines
sur untextConnection
. Supprimez ensuite uniquement les virgules qui se trouvent entre les chiffres:Il est également utile de savoir, mais pas directement pertinent pour cette question, que les virgules en tant que séparateurs décimaux peuvent être gérées par read.csv2 (automatiquement) ou read.table (avec le réglage du paramètre 'dec').
Edit: Plus tard, j'ai découvert comment utiliser colClasses en concevant une nouvelle classe. Voir:
Comment charger df avec séparateur 1000 dans R en tant que classe numérique?
la source
Si le nombre est séparé par "." et décimales par "," (1.200.000,00) en appelant,
gsub
vous devezset fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))
la source
Un moyen très pratique est
readr::read_delim
-famille. Prenant l'exemple d'ici: L'importation de csv avec plusieurs séparateurs dans R vous pouvez le faire comme suit:Ce qui aboutit au résultat attendu:
la source
En utilisant la fonction read_delim, qui fait partie de la bibliothèque readr , vous pouvez spécifier un paramètre supplémentaire:
* Un point-virgule sur la deuxième ligne signifie que read_delim lira les valeurs séparées par des points-virgules csv.
Cela aidera à lire tous les nombres avec une virgule comme des nombres appropriés.
Cordialement
Mateusz Kania
la source
Nous pouvons également utiliser
readr::parse_number
, les colonnes doivent être des caractères cependant. Si nous voulons l'appliquer pour plusieurs colonnes, nous pouvons parcourir les colonnes en utilisantlapply
Ou utilisez
mutate_at
fromdplyr
pour l'appliquer à des variables spécifiques.Les données
la source
Je pense que le prétraitement est la voie à suivre. Vous pouvez utiliser Notepad ++ qui a une option de remplacement d'expression régulière.
Par exemple, si votre fichier ressemblait à ceci:
Ensuite, vous pouvez utiliser l'expression régulière
"([0-9]+),([0-9]+)"
et la remplacer par\1\2
Ensuite, vous pouvez utiliser
x <- read.csv(file="x.csv",header=FALSE)
pour lire le fichier.la source