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?
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
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=".")
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)