我有一个小故事,例如
a <- as_tibble(c("201.1, 202 (abc) 203, 204", "301 / 302.22 def, 303"))
value
<chr>
1 201.1, 202 (abc) 203, 204
2 301 / 302.22 def, 303
现在我想得到一个有两列的data.frame
[1,] 201.1 202
[2,] 301 302.22
通过剪切第二个数字之后的所有内容(第一行中的 202,第二行中的 302.22)并且用分隔符“,”或“/”分隔表达式的剩余部分以获得两列。
我的尝试:
b <- stringr::str_extract(a$value, "([\\.\\d]+)\\D+([\\.\\d]+)\\D+.*", group = c(1, 2))
正则表达式的目的是:
捕获组 1 = 一个或多个 [数字或 .s]
然后是一个或多个非数字
然后捕获组 2 = 一个或多个 [数字或 .s]
然后是一个或多个非数字
然后是任意数量的其他字符
仅返回捕获组 1 和 2。
你可以尝试一下,
do.call(rbind, lapply(a$value, \(i) {
i1 <- regmatches(i, gregexpr("\\d+\\.?\\d*", i))[[1]]; return(i1[c(1, 2)])}))
[,1] [,2]
[1,] "201.1" "202"
[2,] "301" "302.22"