Как разделить текст по списку пользователей, но ввести NA без совпадения и сохранить столбцы - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть произвольный текст, который я разделил, используя список разделителей с tidyr

Проблема

У меня проблема в том, что если один из разделителей отсутствует, а не введен NA, результирующий столбец заполняется следующим соответствием, что означает, что он находится в неправильном столбце. Как я могу заполнить NA вместо (или просто пусто?)

Input

textexample<-c("PatientName is Mr B Goode. Referrer Bilbo Baggins Hospital Number 23434B DOB 13/01/77 Findings All good Diagnosis Normal","PatientName is Mr A Notgood. Hospital Number 666666D DOB 13/01/76 Findings All bad Diagnosis Normal")

Функция для разделения

textexample<-data.frame(textexample,stringsAsFactors = FALSE)
delim<-c("PatientName","Referrer","Hospital Number","DOB","Findings","Diagnosis")
textexample<-textexample %>% 
  tidyr::separate(textexample, into = c("added_name",delim), 
                  sep = paste(delim, collapse = "|"),
                  extra = "drop", fill = "right")

Желаемый выход

 added_name                    PatientName        Referrer Hospital Number        DOB   Findings Diagnosis
1                           is Mr B Goode.   Bilbo Baggins          23434B   13/01/77   All good     Normal
2                           is Mr A Notgood.                        666666D        13/01/76    All bad      Normal      <NA>

Токовый выход

 added_name                    PatientName        Referrer Hospital Number        DOB   Findings Diagnosis
1                           is Mr B Goode.   Bilbo Baggins          23434B   13/01/77   All good     Normal
2                           is Mr A Notgood.    666666D           13/01/76    All bad     Normal      <NA>

1 Ответ

0 голосов
/ 27 апреля 2018

Поместите некоторое разделение в данные:

a=gsub(pattern = paste0("(",delim,")",collapse = "|"),
        replacement = ";\\1\\2\\3\\4\\5\\6;",
       x= paste0(textexample,";"))

b= paste0("(?<=",delim,";).*?(?=;)")

затем извлеките значения:

  map2_dfc(a,list(b),~str_extract(.x,.y)%>%trimws)
# A tibble: 6 x 2
  `1`            `2`             
  <chr>          <chr>           
1 is Mr B Goode. is Mr A Notgood.
2 Bilbo Baggins  NA              
3 23434B         666666D         
4 13/01/77       13/01/76        
5 All good       All bad         
6 Normal         Normal  

или вы можете сделать:

cross2(a,b)%>% 
   invoke_map_chr(str_extract, .)%>%
   matrix(length(a))%>%
   data.frame()  
                  X1              X2        X3         X4         X5      X6
1    is Mr B Goode.   Bilbo Baggins    23434B   13/01/77   All good   Normal
2  is Mr A Notgood.             <NA>  666666D   13/01/76    All bad   Normal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...