распознавание определенного шаблона порядка элементов в R-векторе

#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| вхождение и сохраняем термин, следующий сразу после этого.