web-dev-qa-db-fra.com

Remplacement des virgules et des points dans R

J'ai toute une colonne de chiffres qui inclut des séparateurs de points en milliers et une virgule au lieu de points comme séparateur lugubre. Lorsque j'essaie de créer une colonne numérique, je perds toutes les données.

var1 <- c("50,0", "72,0", "960,0", "1.920,0", "50,0", "50,0", "960,0")
df <- cbind(var1, var2 = as.numeric(gsub(".", "", as.character(var1))))

et enroulé avec:

 var1      var2
[1,] "50,0"    NA  
[2,] "72,0"    NA  
[3,] "960,0"   NA  
[4,] "1.920,0" NA  
[5,] "50,0"    NA  
[6,] "50,0"    NA  
[7,] "960,0"   NA 

Qu'est-ce que je fais mal?

8
Nils Olve

Vous devez échapper le "." dans votre expression régulière et remplacer les virgules par un "." avant de pouvoir convertir en numérique.

> as.numeric(gsub(",", ".", gsub("\\.", "", var1)))
[1]   50   72  960 1920   50   50  960
32
Joshua Ulrich

Pour des choses comme celles-ci, je préfère scan(), car il est facile à comprendre. Juste utiliser 

scan(text=var1, dec=",", sep=".")

Hélas, ce n'est pas plus rapide que gsub(), qui semble au contraire surpuissant. Une autre option rapide est donc sub():

as.numeric(sub(",", ".", sub(".", "", var1, fixed=TRUE), fixed=TRUE))

Et juste au cas où: Lorsque vous lisez directement var1 à partir d'un fichier, il vous suffit de le lire avec le séparateur spécifié: read.table("file.txt", dec=",", sep=".")

5
MERose

Vous pouvez utiliser la fonction "type_convert" du paquet "readr". Je lis un fichier ODS (Locale Portuguese) et convertis les nombres: 

library('readODS')
library('tidyverse')
data <- read_ods('mod-preditivo.ods', sheet=1,col_names = TRUE,range='a1:b30',col_types=NA)
df <- type_convert(data,trim_ws=TRUE,col_types = cols(Pesos=col_integer(),Alturas=col_double()),locale = locale(decimal_mark = ","))
str(df)
0
cleuton