分隔两个不同的分隔符并截断

MPB*_*022 2 r delimiter strsplit

我有一个小问题,例如

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    
Run Code Online (Sandbox Code Playgroud)

现在我想获得一个包含两列的 data.frame

[1,] 201.1  202
[2,] 301    302.22
Run Code Online (Sandbox Code Playgroud)

通过剪切第二个数字之后的所有内容(第一行中的 202,第二行中的 302.22)使用分隔符“,”或“/”分隔表达式的剩余部分以获得两列。

G. *_*eck 5

这里有几种方法。

\n

1) 将Useseparate与 tidyr 分开,如下所示,给出显示的 tibble/data.frame 。它自动确定列是数字的。

\n
library(tidyr)\n\na %>%\n  separate("value", c("value1", "value2"), sep = "[,/ ]+",\n    extra = "drop", convert = TRUE)\n\n## # A tibble: 2 \xc3\x97 2\n##   value1 value2\n##    <dbl>  <dbl>\n## 1   201.   202 \n## 2   301    302.\n
Run Code Online (Sandbox Code Playgroud)\n

2) Base Rstrcapture像这样从base R 使用。不需要任何包。

\n
strcapture("([0-9.]+)[^0-9.]+([0-9.]+).*", a$value, \n  data.frame(value1 = numeric(0), value2 = numeric(0)))\n\n##   value1 value2\n## 1  201.1 202.00\n## 2  301.0 302.22\n
Run Code Online (Sandbox Code Playgroud)\n

3) read.pattern使用read.pattern来自gsubfn。这使用与 (2) 中相同的正则表达式。它会自动确定列是数字列,并使用相同的参数text=col.names=参数,read.table以便您熟悉这些列时可以轻松记住它们。

\n
library(gsubfn)\n\nread.pattern(text = a$value, pattern = "([0-9.]+)[^0-9.]+([0-9.]+).*", \n  col.names = c("value1", "value2"))\n\n##   value1 value2\n## 1  201.1 202.00\n## 2  301.0 302.22\n
Run Code Online (Sandbox Code Playgroud)\n

笔记

\n

问题的输入

\n
library(tibble)\na <- as_tibble(c("201.1, 202 (abc) 203, 204", "301 / 302.22 def, 303"))\n
Run Code Online (Sandbox Code Playgroud)\n