我有一个要转换为数字的字符数据向量,它看起来像这样:
[231] "34.05" "35.05" "36.05" "37.05" "1.09 " "2.09 " "3.09 " "4.09 " "5.09 " "6.09 "
[241] "7.09 " "8.09 " "9.09 " "46.86" "1.9 y" "2.9 y" "3.9 y" "4.9 y" "5.9 y" "6.9 y"
有些条目非常好,例如“ 37.05
”,但是有些错误地提取了它们,例如"4.9 y
”。我只想提取每个条目的部分。
我拥有的是:
data = stringr::str_extract(data, "([^/]+)(?=:space:)")
但是我得到了一堆NA。我应该如何处理?
答案 0 :(得分:2)
您要在字符串的开头获取浮点值,因此请使用
x <- c("33.72", "34.72", "35.72", "36.72", "37.72", "29.05", "30.05", "31.05", "32.05", "33.05",
"34.05", "35.05", "36.05", "37.05", "1.09 ", "2.09 ", "3.09 ", "4.09 ", "5.09 ", "6.09 ",
"7.09 ", "8.09 ", "9.09 ", "46.86", "1.9 y", "2.9 y", "3.9 y", "4.9 y", "5.9 y", "6.9 y")
as.double(sub("^(\\d+\\.\\d+).*", "\\1", x))
详细信息:
^
-字符串的开头(\\d+\\.\\d+)
-捕获组1(在替换模式中称为\1
):1个或多个数字,一个点,然后是1个以上的数字.*
-尽可能多的0个或更多字符。 注意:如果可以包含浮点数和整数,请使用as.double(sub("^(\\d+(?:\\.\\d+)?).*", "\\1", x))
。
请参见regex graph:
答案 1 :(得分:1)
您可以删除所有不是数字或句点的内容。
as.double(gsub("[^0-9\\.]+", "", x))
# [1] 33.72 34.72 35.72 36.72 37.72 29.05 30.05 31.05 32.05 33.05 34.05 35.05 36.05 37.05
#[15] 1.09 2.09 3.09 4.09 5.09 6.09 7.09 8.09 9.09 46.86 1.90 2.90 3.90 4.90
#[29] 5.90 6.90
数据
x <- c("33.72", "34.72", "35.72", "36.72", "37.72", "29.05", "30.05", "31.05", "32.05", "33.05",
"34.05", "35.05", "36.05", "37.05", "1.09 ", "2.09 ", "3.09 ", "4.09 ", "5.09 ", "6.09 ",
"7.09 ", "8.09 ", "9.09 ", "46.86", "1.9 y", "2.9 y", "3.9 y", "4.9 y", "5.9 y", "6.9 y")
答案 2 :(得分:1)
使用阅读器包中的parse_number
更容易
> library(readr)
> parse_number(x)
[1] 33.72 34.72 35.72 36.72 37.72 29.05 30.05 31.05 32.05 33.05 34.05 35.05 36.05 37.05 1.09 2.09 3.09 4.09 5.09
[20] 6.09 7.09 8.09 9.09 46.86 1.90 2.90 3.90 4.90 5.90 6.90
您甚至可以将实际模式从"([^/]+)(?=:space:)"
更改为"\\d+\\.\\d*"
:
stringr::str_extract(x, "\\d+\\.\\d*")