1) gsubfn::strapply strapply 可以一次完成提取和翻译。对于stmt 的每个组件,strapply 将匹配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) Base R 使用上面的L 和pat,创建一个函数,该函数接受单词x 的字符向量并将pat 匹配的单词提取到@ 987654334@。如果g 具有非零长度,则使用L 转换其元素并使用toString 将其压缩为单个字符串;否则,返回No Event。
现在使用strsplit 将stmt 的每个元素拆分为单词,并将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 使用 (1) 中的L 按行号和stmt 分组,并将单词分成单独的行。过滤掉names(L) 中的这些单词,并将所有行折叠到一个stmt 组中,通过L 进行翻译,并使用toString 生成逗号分隔的字符串。删除 n 列。在这一点上,我们得到了想要的结果,除了 No Event 行仍然丢失,所以右加入我们所拥有的 statement 并将 NAs 替换为 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))
更新
重新阅读问题后已多次修改。还添加了更多选择。