1) strapply Определить именованный вектор trans
, который переводит совпадения в типы.Затем найдите имена trans
и переведите каждое из них, используя strapply
.
Первый аргумент strapply
- это входной символьный вектор, второй - сопоставляемый шаблон, третий - это функция, применяемая к совпадениям, выраженным здесь с использованием формульной нотации, аргумент empty
указывает, чтоиспользовать, если совпадения нет, и simplify=TRUE
заставляет его выводить простой символьный вектор, а не список.
library(gsubfn)
trans <- c(http = "web", pptx = "ppt", pdf = "pdf", txt = "txt")
pat <- paste(names(trans), collapse = "|") # http|pptx|pdf|txt
strapply(tolower(d$name), pat, ~ trans[x], empty = "others", simplify = TRUE)
## [1] "others" "ppt" "web" "others" "others" "others" "others"
2) База R Используя trans
сверху, мыможно создать простой цикл.
result <- result.ini <- tolower(d$name)
for(nm in names(trans)) result[ grepl(nm, result) ] <- trans[nm]
result[ result == result.ini ] <- "others"
result
## [1] "others" "ppt" "web" "others" "others" "others" "others"
3) R Base - уменьшить Мы можем использовать Reduce
практически так же, как цикл for
, но без явного цикла:
Match <- function(result, nm) ifelse(grepl(nm, result), trans[nm], result)
out <- Reduce(Match, names(trans), init = tolower(d$name))
out[out == tolower(d$name)] <- "others"
out
## [1] "others" "ppt" "web" "others" "others" "others" "others"
Примечание
Ввод в воспроизводимой форме:
d <-
structure(list(name = structure(c(1L, 3L, 5L, 2L, 4L, 7L, 6L), .Label = c("aaa.doc",
"aaa.jpg", "aaa.pptx", "guide", "http://aaa", "memo", "some"),
class = "factor")), class = "data.frame", row.names = c(NA, -7L))