Извлечь строку по набору предопределенных символов

Я использую 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)     

По-видимому, важен порядок символов в объекте «набор» (см. Пятый элемент). Однако я хочу, чтобы функция просто извлекала символы из вектора ранчар, не заботясь о порядке символов в ранчаре или наборе.

Я думаю, вы неправильно понимаете, как работает str_extract_all. Функция векторизуется по обоим аргументам. Поскольку два ваших вектора имеют разную длину, R неявно перерабатывает set, чтобы соответствовать длине ranchar.. Это означает, что для пятого элемента rancharstr_extract_all попытается сопоставить "ABC".

Maurits Evers 14.09.2018 01:01

Вы говорите "персонажи из вектора", но на самом деле имеете в виду строки, верно? Или "BAC" эквивалентен "ABC"?

r2evans 14.09.2018 01:03

Дополнительно: я не совсем понимаю, что вы пытаетесь сделать. Что вы ожидаете от строки "rtrt, ABC, DEF". Будет ли он возвращать "ABC" или "DEF", или оба, или ничего?

Maurits Evers 14.09.2018 01:04

@MauritsEvers: Думаю, я понимаю, как работает str_extract_all. Но спасибо, что не задумывались о случае, когда несколько предопределенных строк набора встречаются в "целевом" векторе. Я добавил комментарий к ответу G5W.

André 14.09.2018 09:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо того, чтобы указывать аргумент 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»? Если нет, я просто использую обходной путь.

André 14.09.2018 08:55

Другие вопросы по теме