3
votes

Remplacement conditionnel d'une virgule par un point dans une colonne numérique

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)) 


0 commentaires

3 Réponses :


2
votes

Nous pourrions créer une condition logique avec 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)

Notez que la conversion en 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" 


1 commentaires

@NelsonGon. J'ai ajouté plus de description. J'espère que cela aide



1
votes

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" 


0 commentaires

2
votes

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"    


0 commentaires