Я получаю, что NA применяет функцию отдельного () к столбцу символов в R - PullRequest
2 голосов
/ 17 апреля 2020

Я пытаюсь разбить столбец, который отформатирован очень по-разному. Например:

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")

И я использую separate() для разделения на два разных столбца (мне нужно разделить название продукта (например, DOXORUBICINA CLORH. FAM) и детали (50 мг POL O LIOF). )). Код:

separate(data.frame(A = pharma), col = "A" , into = c("x","y"),sep = "(?<=[a-zA-Z])\\s*(?=[0-9])")

Но у меня есть следующий ответ от 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]. 

Я не вижу, что происходит.

Любая помощь очень оценили. Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 17 апреля 2020

Данные во второй и третьей строке содержат точку между буквами и пробелом, ваш шаблон содержит только 0+ пробелов между буквой и ди git.

Вы можете использовать

sep = "(?<=[a-zA-Z])\\W+(?=[0-9])" 

или

sep = "(?<=[a-zA-Z])\\W*(?=[0-9])"

Шаблон \W соответствует любым символам без слов, любому символу, кроме буквы, di git и _.

См. Демонстрационную версию regex .

R test:

> 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
1 голос
/ 17 апреля 2020

Мы можем сделать это за base R

do.call(rbind, strsplit(pharma, "(?<=[A-Za-z])\\s+(?=[0-9])", perl = TRUE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...