Я использую sparklyr и dplyr и пытаюсь создать переменную extract_code, которая бы извлекала определенный шаблон из текстовой переменной.Узор 3 буквы + 3 цифры.Шаблон может появляться несколько раз в одном и том же тексте.В этом случае я бы хотел, чтобы шаблоны разделялись точкой с запятой
. Я создал этот объект, используя регулярное выражение:
regex_pattern <- "[A-Za-z]{3}[0-9]{3}"
Вот что имеет:
test <- data.table(id = 1:3, text= c("(table 012 APM325)", "(JUI524 toto KIO879)" , "(pink car in the field KJU547 MPO362/JHY879)"))
Вот что я хотел бы иметь:
test <- data.table(id = 1:3, text= c("(table 012 APM325)", "(JUI524 toto KIO879)" , "(pink car in the field KJU547 MPO362/JHY879)"), extract_code =c( "APM325", "JUI524;KIO879" , "KJU547;MPO362;JHY879"))
Я пробовал это:
test <- test %>% mutate(extract_code = regexp_extract(text, regex_pattern, 0))
data.table(id = 1:3, text= c("(table 012 APM325)", "(JUI524 toto KIO879)" , "(pink car in the field KJU547 MPO362/JHY879)"), extract_code =c( "APM325", "JUI524" , "KJU547"))
Но я получаю только первый шаблон.
У васесть какие-нибудь советы?Спасибо!
РЕДАКТИРОВАТЬ: ЭТО РАБОТАЕТ!
try <- data.table(id = 1:3, text= c("(table 012 APM325)", "(JUI524 toto KIO879)" , "(pink car in the field KJU547 MPO362/JHY879)"))
sdf_try <- copy_to(sc, try , "try" )
extract.pattern <- function(pat) function(df) {
f <- function(vec) sapply(regmatches(vec, gregexpr(pat, vec)), paste0, collapse = ";")
dplyr::mutate(df, extract_code = f(text))
}
sdf_try %>%
spark_apply(extract.pattern("[A-Z]{3}[0-9]{3}"))
Но это не работает:
regex_pattern <- "[A-Z]{3}[0-9]{3}"
sdf_try %>%
spark_apply(extract.pattern(regex_pattern))
# Error: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 8.0 failed 4 times, most recent failure: Lost task 0.3 in stage 8.0 Exception: sparklyr worker rscript failure with status 255, check worker logs for details.
sdf_try %>%
spark_apply(extract.pattern('regex_pattern'))