Я использую R 3.5 и RStudio.
У меня есть следующий вектор символов, а также предопределенный набор символов (другой вектор). Я хочу использовать предопределенный набор для извлечения символов из вектора независимо от порядка символов в предопределенном наборе.
MWE:
ranchar <- c("rtrt, ABC","DEF, ktg", "eeh ABC HuJ","hJN, DEF, Jjk","hJN, DEF, Jjk")
set <- c("ABC","DEF")
В результате я хочу получить вектор или список, например
[1] "ABC" "DEF" "ABC" "DEF" "DEF"
Однако использование str_extract_all из пакета stringr приводит к
library(stringr)
str_extract_all(ranchar, set)
[[1]]
[1] "ABC"
[[2]]
[1] "DEF"
[[3]]
[1] "ABC"
[[4]]
[1] "DEF"
[[5]]
character(0)
По-видимому, важен порядок символов в объекте «набор» (см. Пятый элемент). Однако я хочу, чтобы функция просто извлекала символы из вектора ранчар, не заботясь о порядке символов в ранчаре или наборе.
Вы говорите "персонажи из вектора", но на самом деле имеете в виду строки, верно? Или "BAC" эквивалентен "ABC"?
Дополнительно: я не совсем понимаю, что вы пытаетесь сделать. Что вы ожидаете от строки "rtrt, ABC, DEF". Будет ли он возвращать "ABC" или "DEF", или оба, или ничего?
@MauritsEvers: Думаю, я понимаю, как работает str_extract_all. Но спасибо, что не задумывались о случае, когда несколько предопределенных строк набора встречаются в "целевом" векторе. Я добавил комментарий к ответу G5W.





Вместо того, чтобы указывать аргумент pattern для str_extract как set, вам нужно превратить его в регулярное выражение, которое допускает любой из элементов набора.
str_extract(ranchar, paste0(set, collapse = "|"))
"ABC" "DEF" "ABC" "DEF" "DEF"
Шаблон такой:
paste0(set, collapse = "|")
[1] "ABC|DEF"
что позволяет "ABC" или "DEF"
Спасибо, это именно то, что я хотел. Относится к вопросу Маурица Эверса: есть ли способ получить только первый или последний элемент, если в строке есть «rtrt, ABC, DEF»? Если нет, я просто использую обходной путь.
Я думаю, вы неправильно понимаете, как работает
str_extract_all. Функция векторизуется по обоим аргументам. Поскольку два ваших вектора имеют разную длину, R неявно перерабатываетset, чтобы соответствовать длинеranchar.. Это означает, что для пятого элементаrancharstr_extract_allпопытается сопоставить"ABC".