#r #pattern-matching
#r #сопоставление с образцом
Вопрос:
У меня есть список векторов, каждый из которых выглядит следующим образом
c («Япония», «США», «страна», «Япония», «источник», «страна», «Великобритания», «источник», «страна», «США»)
Моя задача — извлечь название страны после первого c («источник», «страна»), поэтому «Великобритания» будет названием страны, которое будет извлечено в этом примере. Во всех векторах за c («источник», «страна») будет следовать название страны, поэтому мне просто нужно извлечь элемент сразу после первого c («источник», «страна»).
Ответ №1:
Вы можете использовать следующее, чтобы найти первый индекс того, где source
находится раньше country
, и добавить 2:
x <- c("Japan", "USA", "country", "Japan", "source", "country", "UK", "source", "country", "USA")
x[which((x == "source")[-length(x)] amp; (x == "country")[-1])[1] 2]
# [1] "UK"
Комментарии:
1. Аналогично :
x[which.max(head(x, -1) == 'source' amp; tail(x, -1) == 'country') 2]
2. @RonakShah — я избегал
which.max()
, поскольку он все равно вернет результат в случае отсутствия совпадений — безопаснее использоватьwhich()
, хотя OP говорит, что во всех векторах будет совпадение.
Ответ №2:
Мы могли бы попробовать использовать здесь подход с регулярным выражением вставки:
v <- c("Japan", "USA", "country", "Japan", "source", "country", "UK", "source", "country", "USA")
terms <- paste(v, collapse="|")
country <- sub("^.*?\|source\|country\|(.*?)\|.*$", "\1", terms)
country
[1] "UK"
Используемый здесь подход заключается в формировании списка терминов с разделителями в виде:
Japan|USA|country|Japan|source|country|UK|source|country|USA
Затем мы ищем первое |source|country|
вхождение и сохраняем термин, следующий сразу после этого.