Je nettoie actuellement certaines données allemandes. Les données allemandes sont formatées différemment de la normale. En allemand, mille avec deux décimales vaut 1.000,00 En anglais, il est 1000,00 Je voudrais d'abord supprimer le point dans le 1.000,00, puis remplacer la virgule par un point, mais uniquement lorsqu'il existe à la fois une virgule et un point dans le nombre. Si le nombre n'a qu'un point et pas de virgule, alors je voudrais conserver le point.
J'ai essayé un gsub normal, mais bien sûr ce n'est pas conditionnel
#input raw$obs_values<-c(1.000,00 , 8.3 , 2.900,00 , 9.2) #output raw$obs_values<-c(1000.00 , 8.3 , 2900.00 , 9.2)
En bref, ce dont j'ai besoin est:
tidy$obs_values<-as.character(gsub(",",".",tidy$obs_values))
3 Réponses :
Nous pourrions créer une condition logique avec Notez que la conversion en as.numeric
et is.na
comme conversion en numérique
renvoie NA code > si la valeur n'est pas une syntaxe numérique légitime. Dans l'exemple, les premier et troisième éléments ont
,
, donc il est interprété comme caractère
et donne donc NA
. En utilisant is.na
, construisez un vecteur logique puis appliquez la logique de remplacement avec sub
sur le vecteur de sous-ensemble. Cependant, cela peut être fait avec grep
aussi bien str1 <- c('1.000,00', 8.3, '2.900,00', 9.2)
numérique
supprimera les zéros de fin as.numeric(str1)
#[1] 1000.0 8.3 2900.0 9.2
données
i1 <- is.na(as.numeric(str1))
str1[i1] <- sub(",", ".", sub("\\.", "", str1[i1]))
str1
#[1] "1000.00" "8.3" "2900.00" "9.2"
@NelsonGon. J'ai ajouté plus de description. J'espère que cela aide
Voici une approche. Nous pouvons diviser chaque terme par une virgule, puis supprimer les points pour les nombres qui ont une composante virgule / décimale. Pour les nombres qui n'ont pas de virgule, nous utilisons simplement la valeur d'origine.
obs_values <- c("1.000,00", "8.3", "2.900,00", "9.2") output <- sapply(obs_values, function(x) { parts <- strsplit(x, ",")[[1]] return(ifelse(length(parts) > 1, paste0(gsub("\\.", "", parts[1]), ".", parts[2]), parts[1])) }) output 1.000,00 8.3 2.900,00 9.2 "1000.00" "8.3" "2900.00" "9.2"
Voici une tentative très sommaire de stringr
:
new1<-str_replace_all(raw,",(?=\\d)",".") str_remove_all(new1,".(?=\\d{3,})")
Ou plus généralement comme suggéré par @akrun Vous pouvez remplacer d par [0-9]
raw<-c("1.000,00" , "8.3" , "2.900,00" , "9.2") new<-str_replace_all(raw,",(?=0)",".") str_remove_all(new,".(?=\\d{3,})") [1] "1000.00" "8.3" "2900.00" "9.2"