2 votes

Comment trouver et remplacer les chiffres d'un texte avec des valeurs arrondies dans R ?

J'ai le tableau suivant de valeurs numériques en caractères.

X0 <- c("288", "74.00 [67.75, 80.00]", "196 (68.1)", "64.50 [57.00, 72.00]", 
"1.90 [1.80, 2.00]", "27.65 [25.37, 30.63]", "138.00 [125.00, 152.00]", 
"74.00 [67.50, 81.00]", "29 (10.2)", "2.84 [2.54, 3.20]", "18.00 [14.00, 23.00]", 
"1.26 [1.07, 1.47]", "0.65 [0.58, 0.75]", "2.20 [2.00, 2.36]", 
"3.80 [3.14, 4.36]", "21.80 [19.20, 25.00]", "43.89 [37.56, 50.00]", 
"65.00 [60.00, 65.00]", "274 (95.1)", "253 (87.8)", "", "59 (20.5)", 
"189 (65.6)", "40 (13.9)", "", "8 (21.6)", "6 (16.2)", "21 (56.8)", 
"2 ( 5.4)", "851.50 [492.00, 1426.00]", "601.50 [337.75, 947.75]", 
"447.50 [261.25, 740.50]", "226.50 [130.00, 353.25]", "43 (14.9)", 
"4.50 [0.00, 30.25]", "11 ( 8.9)", "39 (31.7)", "3.38 [1.90, 5.22]"

Je dois remplacer tous les nombres décimaux par des valeurs arrondies à une décimale.

J'ai essayé ça :

str_replace(X0, "[0-9]{1,}(\\.)[0-9]{1,}", as.character(round(as.numeric("\\0"),1)))

et quelques autres variations de ce qui suit, mais cela ne donne que des résultats avec NA.

Comment puis-je remplacer ces valeurs par des caractères ? C'est malheureusement ainsi que les données me parviennent. J'ai besoin de remplacer ces valeurs en place. Je ne peux pas simplement convertir chaque élément en numérique car il y a ces parenthèses et ces crochets que je ne peux pas enlever.

2voto

Tim Biegeleisen Points 53335

Essayez d'utiliser str_replace_all avec une fonction de rappel :

library(stringr)
str_replace_all(X0, "\\b\\d+\\.\\d+\\b", function(x) as.character(round(as.numeric(x), 1)))

L'idée ici est de faire correspondre et de remplacer tout nombre décimal par sa version arrondie à une décimale. Notez que dans la fonction de rappel, nous devons effectuer deux castings, une fois en numérique pour effectuer l'arrondi, puis une seconde fois pour récupérer une version en caractères du nombre arrondi.

Comme l'a déjà souligné M. Flick, il serait peut-être plus facile de corriger vos données à la source plutôt que de suivre cette voie.

0voto

jay.sf Points 8160

Une tentative utilisant strsplit() .

parentheses <- grep("\\(", X0)
brackets <- grep("\\[", X0)

values <- lapply(strsplit(X0, "\\,|\\[|\\]|\\(|\\)"), function(x) round(as.numeric(x), 1))

values[parentheses] <- Map(function(x) paste0(x[1], " (", x[2], ")"), values[parentheses])
values[brackets] <- Map(function(x) paste0(x[1], " [", x[2], ", ", x[3], "]"), values[brackets])
unlist(values)
# [1] "288"                  "74 [67.8, 80]"        "196 (68.1)"           "64.5 [57, 72]"       
# [5] "1.9 [1.8, 2]"         "27.6 [25.4, 30.6]"    "138 [125, 152]"       "74 [67.5, 81]"       
# [9] "29 (10.2)"            "2.8 [2.5, 3.2]"       "18 [14, 23]"          "1.3 [1.1, 1.5]"      
# [13] "0.6 [0.6, 0.8]"       "2.2 [2, 2.4]"         "3.8 [3.1, 4.4]"       "21.8 [19.2, 25]"     
# [17] "43.9 [37.6, 50]"      "65 [60, 65]"          "274 (95.1)"           "253 (87.8)"          
# [21] "59 (20.5)"            "189 (65.6)"           "40 (13.9)"            "8 (21.6)"            
# [25] "6 (16.2)"             "21 (56.8)"            "2 (5.4)"              "851.5 [492, 1426]"   
# [29] "601.5 [337.8, 947.8]" "447.5 [261.2, 740.5]" "226.5 [130, 353.2]"   "43 (14.9)"           
# [33] "4.5 [0, 30.2]"        "11 (8.9)"             "39 (31.7)"            "3.4 [1.9, 5.2]"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X