我有以下数值字符向量。
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/