Как захватить только части строки в R? - PullRequest
0 голосов
/ 30 апреля 2019

Я хотел бы захватить некоторые части строк, используя stringr::str_match и rebus::capture, но не могу разобрать правильный шаблон.

Текст может содержать некоторые специальные символы.Что-то вроде:

enter image description here

Данные:

df <- structure(list(ID = c(1, 1, 1, 2, 2), TEXT = c("VERIFIED DATE/TIME: 24/11/2018 16:23, VERIFIED PERSON IN CHARGE: JOHN", 
"HISTORY aaaAAA# 111 FINDINGS Bb123 CONCLUSION 987CCC ccc654", 
"DIAGNOSIS abc def hij", "VERIFIED DATE/TIME: 25/10/2018 16:23, VERIFIED PERSON IN CHARGE: Mary", 
"HISTORY eeeEEE@ 111 FINDINGS Bb321 CONCLUSION 987FFF ggg654"
)), .Names = c("ID", "TEXT"), row.names = c(NA, 5L), class = "data.frame")
#   ID                                                                  TEXT
# 1  1 VERIFIED DATE/TIME: 24/11/2018 16:23, VERIFIED PERSON IN CHARGE: JOHN
# 2  1           HISTORY aaaAAA# 111 FINDINGS Bb123 CONCLUSION 987CCC ccc654
# 3  1                                                 DIAGNOSIS abc def hij
# 4  2 VERIFIED DATE/TIME: 25/10/2018 16:23, VERIFIED PERSON IN CHARGE: Mary
# 5  2           HISTORY eeeEEE@ 111 FINDINGS Bb321 CONCLUSION 987FFF ggg654

Желаемый выход: Я хотел бы разбить текст на разные столбцы:

  1. ПРОВЕРЕННАЯ ДАТА / ВРЕМЯ
  2. ПРОВЕРЕННЫЙ ЧЕЛОВЕК В ЗАРЯДЕ
  3. ИСТОРИЯ
  4. НАХОДКИ
  5. ЗАКЛЮЧЕНИЕ
  6. ДИАГНОСТИКА
df_out <- structure(list(ID = c(1, 2), `VERIFIED DATE/TIME` = c("24/11/2018 16:23,", 
"25/10/2018 16:23,"), `VERIFIED PERSON IN CHARGE` = c("JOHN", 
"Mary"), HISTORY = c("aaaAAA# 111", "eeeEEE@ 111"), FINDINGS = c("Bb123", 
"Bb321"), CONCLUSION = c("987CCC ccc654", "987FFF ggg654"), DIAGNOSIS = c("abc def hij", 
NA)), .Names = c("ID", "VERIFIED DATE/TIME", "VERIFIED PERSON IN CHARGE", 
"HISTORY", "FINDINGS", "CONCLUSION", "DIAGNOSIS"), row.names = 1:2, class = "data.frame")

Код:

Я попробовал следующий код,но это дает мне NA:

library(stringr)
library(rebus)
str_match(df$TEXT, pattern = "VERIFIED DATE/TIME:" %R%
            capture(one_or_more(ANY_CHAR)) %R%
            "VERIFIED PERSON IN CHARGE:" %R%
            capture(one_or_more(ANY_CHAR)))

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Вот один из способов использования stringr

library(tidyr)
library(dplyr)
library(stringr)


df2 <- df %>% 
  group_by(ID) %>%
  summarise(conc_text = paste(TEXT, collapse = ", ")) %>%
  mutate(verified_date = apply(str_match(conc_text, "VERIFIED DATE/TIME: (.*?),"), 1, FUN = function(x) x[2]),
         verified_person = apply(str_match(conc_text, "VERIFIED PERSON IN CHARGE: (.*?),"), 1, FUN = function(x) x[2]),
         history = apply(str_match(conc_text, "HISTORY (.*?[0-9]{3})"), 1, FUN = function(x) x[2]),
         findings = apply(str_match(conc_text, "FINDINGS (.*?[0-9]{3})"), 1, FUN = function(x) x[2]),
         conclusions = apply(str_match(conc_text, "CONCLUSION (.*[0-9]{3})"), 1, FUN = function(x) x[2]),
         diagnosis = apply(str_match(conc_text, "DIAGNOSIS (.*$)"), 1, FUN = function(x) x[2]))

Сначала объедините текст ID.

Предполагая, что переменные HISTORY, FINDINGS и CONCLUSIONS оканчиваются 3-значным числом, поэтому и существует выражение [0-9]{3}. Используйте функцию apply для получения подходящих строк.

0 голосов
/ 30 апреля 2019

Объединение библиотек tm и stringr.Сначала мы создаем целый текст для каждого ID, также добавляя , перед FINDINGS и CONCLUSION для согласованности

library(tm)
library(stringr)
library(dplyr)
df = df%>%group_by(ID)%>%summarise(TEXT=paste(TEXT,collapse=", "))%>%mutate(TEXT=gsub("(.*)( FINDINGS.*)( CONCLUSION.*)","\\1,\\2,\\3",TEXT))
> df
# A tibble: 2 x 2
     ID TEXT                                                                                                                                        
  <dbl> <chr>                                                                                                                                       
1     1 VERIFIED DATE/TIME: 24/11/2018 16:23, VERIFIED PERSON IN CHARGE: JOHN, HISTORY aaaAAA# 111, FINDINGS Bb123, CONCLUSION 987CCC ccc654, DIAGN~
2     2 VERIFIED DATE/TIME: 25/10/2018 16:23, VERIFIED PERSON IN CHARGE: Mary, HISTORY eeeEEE@ 111, FINDINGS Bb321, CONCLUSION 987FFF ggg654 

Затем определяем имена, которые нам нужно сохранить, в качестве имен столбцов иудалите их из строки

titles = c("VERIFIED DATE/TIME: ","VERIFIED PERSON IN CHARGE: ","HISTORY ","FINDINGS ","CONCLUSION ","DIAGNOSIS ")
df$TEXT = removeWords(df$TEXT,titles)
> df
# A tibble: 2 x 2
     ID TEXT                                                                  
  <dbl> <chr>                                                                 
1     1 24/11/2018 16:23, JOHN, aaaAAA# 111, Bb123, 987CCC ccc654, abc def hij
2     2 25/10/2018 16:23, Mary, eeeEEE@ 111, Bb321, 987FFF ggg654 

Наконец, мы разбиваем столбцы на , и устанавливаем имена столбцов.

df_fin=str_split_fixed(df$TEXT, ", ",6)
colnames(df_fin)=titles
> df_fin
     VERIFIED DATE/TIME:  VERIFIED PERSON IN CHARGE:  HISTORY       FINDINGS  CONCLUSION      DIAGNOSIS    
[1,] "24/11/2018 16:23"   "JOHN"                      "aaaAAA# 111" "Bb123"   "987CCC ccc654" "abc def hij"
[2,] "25/10/2018 16:23"   "Mary"                      "eeeEEE@ 111" "Bb321"   "987FFF ggg654" "" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...