繁体   English   中英

如何在R中使用四舍五入的值查找和替换文本中的数字?

[英]How to find and replace digits from a text with rounded values in R?

我有以下数值字符向量。

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]"

我需要用四舍五入的值替换所有十进制数字到 1 个小数位。

我试过这个:

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

以及以下几个其他变体,但它只产生 NA 的结果。

如何将这些值替换为字符? 不幸的是,这就是我获得数据的方式。 我需要替换这些值。 我不能简单地将每个元素转换为数字,因为我无法删除这些括号和方括号。

尝试使用带有回调函数的str_replace_all

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

这里的想法是匹配和替换任何十进制数,其四舍五入到一位小数位版本。 请注意,在回调函数中,我们需要转换两次,一次转换为数字以进行舍入,然后第二次获取舍入后数字的字符版本。

正如 Flick 先生已经指出的那样,从源头修复数据可能比走这条路更容易。

尝试使用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]"      

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM