Захватить, если строка содержит определенное число

У меня есть набор данных, подобный приведенному ниже -

> a_i
 [1] "Our-Facebook-Page/td-p/3175990"                           
 [2] "Our-Facebook-Page/td-p/3175990/page/2"  
   ....    
[17] "Data-duplicate-files/td-p/4743405"                  
[18] "Data-duplicate-files/td-p/4743405/page/2"            
[19] "Subscription-Release-1-sucks/td-p/4556739"       
[20] "Subscription-Release-1-sucks/td-p/4556739/page/2"

 > b_i
[1] "Data-duplicate-files/td-p/4743405"                  
[2] "Subscription-Release-1-sucks/td-p/4556739"
[3] "Quick-fix/td-p/4556740"

Моя цель - найти 7-значные числа, которые существуют только в b_i (например, 4743405, 4556739, 4556740), и получить данные из a_i, которые содержат соответствующие числа. Итак, окончательный результат будет примерно таким -

[1] "Data-duplicate-files/td-p/4743405"                  
[2] "Data-duplicate-files/td-p/4743405/page/2"            
[3] "Subscription-Release-1-sucks/td-p/4556739"       
[4] "Subscription-Release-1-sucks/td-p/4556739/page/2""

Я могу получать числа с помощью strsplit (b_i, "/"), но я застрял в захвате списков, содержащих совпадающие числа. Есть ли какой-нибудь элегантный способ сопоставить эти числа и получить списки?


person user1486507    schedule 21.02.2014    source источник


Ответы (2)


Ваши данные не в воспроизводимом формате, поэтому я не пробовал это, но здесь используется несколько иной подход, чем IShouldBUyABoat, просто применяя правило из семи цифр для идентификации чисел:

sapply(regmatches(b_i,regexpr("[[:digit:]]{7}", b_i)),
       function(x) a_i[grepl(x, a_i)])
person Thomas    schedule 21.02.2014

a_i[grep( paste( gsub("(^.+/)([[:digit:]])(/.+$)", "\\2", b_i), 
                 collapse="|"), 
     a_i)]
[1] "Data-duplicate-files/td-p/4743405"               
[2] "Data-duplicate-files/td-p/4743405/page/2"        
[3] "Subscription-Release-1-sucks/td-p/4556739"       
[4] "Subscription-Release-1-sucks/td-p/4556739/page/2"

Это создает набор цепочек цифр, разделенных вертикальной чертой, чтобы сформировать шаблон greppish-OR. Если вы хотите применить правило семи цифр, вы можете добавить квантор повторения {}. На данный момент он принимает любое количество цифр между косой чертой.

person IRTFM    schedule 21.02.2014