1) gsubfn :: strapply strapply
может выполнять извлечение и перевод одновременно.strapply
для каждого компонента stmt
будет соответствовать шаблону pat
, и все совпадения будут переведены с использованием L, а затем возвращены.Аргумент empty
определяет, что возвращается для компонентов stat
, не имеющих совпадений.Это дает список совпадений, один компонент списка на строку, к которому применяется toString
для преобразования каждого в разделенную запятыми символьную строку.Это самая короткая из 3 представленных здесь альтернатив.
library(gsubfn)
L <- list(APC = "APC", EMR = "EMR", HALO = "RFA", RFA = "RFA")
pat <- paste(names(L), collapse = "|")
transform(statement,
out = sapply(strapply(stmt, pat, L, empty = "No Event"), toString),
stringsAsFactors = FALSE)
, дающая:
stmt out
1 I have performed APC and RFA APC, RFA
2 An EMR was done EMR
3 I didn't do anything No Event
2) База R Использование L
и pat
извыше, создайте функцию, которая берет символьный вектор слов x
и извлекает те слова, которые соответствуют pat
в g
.Если g
имеет ненулевую длину, переведите его элементы, используя L
, и сожмите его в одну строку, используя toString
;в противном случае верните No Event
.
Теперь разделите каждый элемент stmt
на слова, используя strsplit
, и примените process
к каждому такому вектору символов.
process <- function(x) {
g <- grep(pat, x, value = TRUE)
if (length(g)) toString(L[g]) else "No Event"
}
transform(statement, out = sapply(strsplit(stmt, "\\s+"), process),
stringsAsFactors = FALSE)
3) dplyr / tidyr Используя L
из (1), сгруппируйте по номеру строки и stmt
и разделите слова на отдельные строки.Отфильтруйте эти слова в names(L)
и сверните все строки в одну группу stmt
, переводя через L
и используя toString
, чтобы создать строку через запятую.Оставьте столбец n
.На данный момент у нас есть желаемый результат, за исключением того, что No Event
строк по-прежнему не хватает, поэтому объедините правильные значения с statement
и замените NA на No Event
.
library(dplyr)
library(tidyr)
statement %>%
group_by(n = 1:n(), out = stmt) %>%
separate_rows(out) %>%
filter(out %in% names(L)) %>%
summarize(stmt = stmt[1], out = toString(L[out])) %>%
ungroup %>%
select(-n) %>%
right_join(statement, by = "stmt") %>%
mutate(out = if_else(is.na(out), "No Event", out))
, получив:
# A tibble: 3 x 2
stmt out
<chr> <chr>
1 I have performed APC and RFA APC, RFA
2 An EMR was done EMR
3 I didn't do anything No Event
Примечание
Мы использовали это в качестве ввода:
statement <- structure(list(stmt = c("I have performed APC and RFA",
"An EMR was done", "I didn't do anything")),
class = "data.frame", row.names = c(NA, -3L))
Обновления
Несколько раз пересматривали после повторного чтения вопроса.Также добавлено больше альтернатив.