web-dev-qa-db-fra.com

Comment lire en chiffres avec une virgule comme séparateur décimal?

J'ai une série de fichiers CSV où les nombres sont formatés dans le style européen en utilisant des virgules au lieu de points décimaux, c'est-à-dire 0,5 au lieu de 0.5.

Il y a trop de ces fichiers pour les éditer avant de les importer vers R. J'espérais qu'il existe un paramètre simple pour la fonction read.csv(), ou une méthode à appliquer au jeu de données extrait pour que R traite les données sous forme de nombre un string.

25
klonq

Lorsque vous cochez ?read.table, vous trouverez probablement toute la réponse dont vous avez besoin.

Il existe deux problèmes avec les fichiers csv européens (continentaux):

  1. Que signifie la c dans CSV? Ceci est un , pour le format standard csv, un ; pour le format csv européen
    sep est l'argument correspondant dans read.table
  2. Quel est le caractère du point décimal? Ceci est un . pour le format standard csv, un , pour le format csv européen
    dec est l'argument correspondant dans read.table

Pour lire csv standard, utilisez read.csv, pour lire csv européen, utilisez read.csv2. Ces deux fonctions sont simplement des wrappers à read.table qui définissent les arguments appropriés.

Si votre fichier ne suit aucune de ces normes, définissez les arguments manuellement.

38
Henrik

De ?read.table:

dec     the character used in the file for decimal points.

Et oui, vous pouvez également l'utiliser pour read.csv. (pour moi: non stupide, vous ne pouvez pas!) 

Alternativement, vous pouvez également utiliser 

read.csv2

qui suppose un "," séparateur décimal et un ";" pour les séparateurs de colonnes. 

12
aL3xa
read.csv(... , sep=";")

Supposons que ce champ importé s'appelle "montant", vous pouvez corriger le type de cette façon si vos nombres sont lus sous forme de caractère: 

d$amount <- sub(",",".",d$amount)
d$amount <- as.numeric(d$amount)

Cela m’arrive souvent avec d’autres petits ennuis lors de l’importation à partir d’Excel ou d’Excel. Comme il semble qu’il n’existe aucun moyen cohérent d’obtenir ce que vous attendez lorsque vous importez dans R, les correctifs post-hoc semblent être la meilleure méthode. Par là, je veux dire, regardez ce que vous avez importé - assurez-vous que c'est ce que vous attendiez et corrigez-le s'il ne l'est pas. 

3

Les problèmes peuvent également être résolus si vous indiquez comment vos valeurs manquantes sont représentées (na.strings = ...). Par exemple, V1 et V2 ont ici le même format (décimales séparées par "," dans le fichier csv), mais étant donné que les NA sont présents dans V1, il est interprété comme facteur 

dat <- read.csv2("...csv", header=TRUE)
head(dat)

> ID x    time    V1    V2
> 1  1   0:01:00 0,237 0.621
> 2  1   0:02:00 0,242 0.675
> 3  1   0:03:00 0,232 0.398


dat <- read.csv2("...csv", header=TRUE, na.strings="---")
head(dat)

> ID x    time    V1    V2
> 1  1   0:01:00 0.237 0.621
> 2  1   0:02:00 0.242 0.675
> 3  1   0:03:00 0.232 0.398
2
verena

peut être utilisé comme suit:

mydata <- read.table (fileIn, dec = ",")

fichier d'entrée (fileIn):

D:\TEST> plus input2.txt

06-05-2014 09:19:38 3,182534 0

06-05-2014 09:19:51 4,2311 0

1
Lowreno

peut être

as.is=T

cela empêche également de convertir les colonnes de caractères en facteurs

1
dmeu

Juste pour ajouter à la réponse de Brandon ci-dessus, qui a bien fonctionné pour moi (je n'ai pas assez de représentant pour commenter):

Si vous utilisez

    d$amount <- sub(",",".",d$amount)
    d$amount <- as.numeric(d$amount)

n'oubliez pas que vous aurez peut-être besoin de sub("[.]", "", d$amount, Perl=T) pour contourner le caractère .

0
RobertMyles