我在 R 中的字符列上应用了 NA 的separate() 函数

Die*_*los 2 regex r strsplit

我正在尝试拆分格式非常不同的列。例如:

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)

我看不到发生了什么。

任何帮助都受到高度赞赏。先感谢您!

Wik*_*żew 5

第二行和第三行的数据在字母和空格之间包含一个点,您的模式仅占字母和数字之间的 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)