r - 如何在 R 中查找和替换具有舍入值的文本中的数字?

标签 r regex str-replace

我有以下数值字符向量。

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 先生已经指出的那样,从源头修复数据可能比走这条路更容易。

关于r - 如何在 R 中查找和替换具有舍入值的文本中的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59035375/

相关文章:

php - 替换字符串中最后一次出现的异常(exception)项

r - Linux 中 MatchIt 包中的倾向得分匹配

javascript - 正则表达式 - 排除括号和带特殊键的括号

regex - 在 perl 中处理 curl 输出

php - 文件时间 "warning stat failed for"

php - 使用数组时 str_replace 更快吗?

r - 在drc包中找不到数据集 'FA'

r - ifelse 应用于由日期范围定义的多行

r - 如何更改ggplot2的scale_fill_brewer中一个值的颜色值?

javascript - 如何替换字符串中的int值并调整字段长度