我正在尝试拆分格式非常不同的列。例如:
pharma <- c("DOXORUBICINA CLORH. FAM 50MG POL O LIOF",
"DROSPIRENONA/ETINILESTR. 3/0,02MG CM REC",
"DROSPIRENONA/ETINILESTR. 3/0,03MG CM REC",
"ETRAVIRINA 100 MG CM",
"AGALSIDASA ALFA 1MG/ML X 3,5 ML FAM")
Run Code Online (Sandbox Code Playgroud)
我正在使用separate()在两个不同的列中进行拆分(我需要将产品名称(即 DOXORUBICINA CLORH. FAM)和详细信息(50MG POL O LIOF)分开)。代码是:
separate(data.frame(A = pharma), col = "A" , into = c("x","y"),sep = "(?<=[a-zA-Z])\\s*(?=[0-9])")
Run Code Online (Sandbox Code Playgroud)
但我有来自 R 的下一个:
x y
1 DOXORUBICINA CLORH. FAM 50MG POL O LIOF
2 DROSPIRENONA/ETINILESTR. 3/0,02MG CM REC <NA>
3 DROSPIRENONA/ETINILESTR. 3/0,03MG CM REC <NA>
4 ETRAVIRINA 100 MG CM
5 AGALSIDASA ALFA 1MG/ML X
Warning messages:
1: Expected 2 pieces. Additional pieces discarded in 1 rows [5].
2: Expected 2 pieces. Missing pieces filled with `NA` in 2 rows [2, 3].
Run Code Online (Sandbox Code Playgroud)
我看不到发生了什么。
任何帮助都受到高度赞赏。先感谢您!
第二行和第三行的数据在字母和空格之间包含一个点,您的模式仅占字母和数字之间的 0+ 个空格字符。
您可以使用
sep = "(?<=[a-zA-Z])\\W+(?=[0-9])"
Run Code Online (Sandbox Code Playgroud)
或者
sep = "(?<=[a-zA-Z])\\W*(?=[0-9])"
Run Code Online (Sandbox Code Playgroud)
该\W模式匹配任何非单词字符,除字母、数字和_.
请参阅正则表达式演示。
测试:
> separate(data.frame(A = pharma), col = "A" , into = c("x","y"), sep = "(?<=[a-zA-Z])\\W*(?=[0-9])")
x y
1 DOXORUBICINA CLORH. FAM 50MG POL O LIOF
2 DROSPIRENONA/ETINILESTR 3/0,02MG CM REC
3 DROSPIRENONA/ETINILESTR 3/0,03MG CM REC
4 ETRAVIRINA 100 MG CM
Run Code Online (Sandbox Code Playgroud)