2016-01-22 2 views
1

Я пытался частично соответствовать два содержимым столбцам на основе списка регулярных выражений, общий для обоего колонок:Частичной строка матч два столбца R

dats<-data.frame(ID=c(1:3),species=c("dog","cat","rabbit"), 
species.descriptor=c("all animal dog","all animal cat","rabbit exotic"),product=c(1,2,3), 
product.authorise=c("all animal dog cat rabbit","cat horse pig","dog cat")) 

с целью достижения этой цели:

goal<-data.frame(ID=c(1:3),species=c("dog","cat","rabbit"), 
      species.descriptor=c("all animal dog","all animal cat","rabbit exotic"), 
      product=c(1,2,3),product.authorise=c("all animal dog cat rabbit","cat horse pig", 
      "dog cat"), authorised=c("TRUE","TRUE","FALSE"))  

Итак, чтобы объяснить, если «собака» появляется в любой точке в обоих столбцах, тогда это будет считаться «ИСТИНА» в $ match - и это применимо для любого индивидуального дескриптора вида. Если совпадений не найдено, то возврат либо FALSE, либо na будет в порядке.

До сих пор я добрался до этой точки:

library(stringr) 
patts<-c("dog","cat","all animal") 
reg.patts<-paste(patts,collapse="|") 
dats$matched<-ifelse((str_extract(dats$species.descriptor,reg.patts) == str_extract(dats$product.authorise,reg.patts)),"TRUE","FALSE") 
dats 
    ID species species.descriptor product   product.authorise matched 
    1  dog  all animal dog  1 all animal dog cat rabbit TRUE 
    2  cat  all animal cat  2    cat horse pig FALSE 
    3 rabbit  rabbit exotic  3     dog cat <NA> 

Как вы можете видеть, это правильно идентифицирует первые и последние ряды как «все животное» появляется первым в обеих строках, и нет матча на все в последнем. Однако, похоже, он работает (как во второй строке), когда reg exp не появляется сначала в строке. Я попытался str_extract_all, но до сих пор приводил к сообщениям об ошибках. Мне было интересно, может ли кто-нибудь помочь, пожалуйста?

+1

Извинения знал, что я что-то забыл! library (stringr) –

ответ

1

Вот решение, использующее dplyr для трубопроводов. Основной компонент использует grepl для логического соответствия строк species как в species.descriptor, так и product.authorised.

library(dplyr) 
dats %>% 
rowwise() %>% 
mutate(authorised = 
      grepl(species, species.descriptor) & 
      grepl(species, product.authorise) 
     ) 

Source: local data frame [3 x 6] 
Groups: <by row> 

    ID species species.descriptor product   product.authorise authorised 
    (int) (fctr)    (fctr) (dbl)     (fctr)  (lgl) 
1  1  dog  all animal dog  1 all animal dog cat rabbit  TRUE 
2  2  cat  all animal cat  2    cat horse pig  TRUE 
3  3 rabbit  rabbit exotic  3     dog cat  FALSE 

Если вы действительно любите stringr вы можете использовать функцию str_detect для более удобных для пользователя синтаксиса.

library(stringr) 
dats %>% 
mutate(authorised = 
      str_detect(species.descriptor, species) & 
      str_detect(product.authorise, species) 
     ) 

И если вам не нравится dplyr вы можете добавить колонку непосредственно

dats$authorised <- 
    with(dats, 
     str_detect(species.descriptor, species) & 
      str_detect(product.authorise, species) 
     ) 
+3

dplyr здесь вовсе не требуется, op не использовал его, почему вы вводите зависимость – rawr

+0

Спасибо за ваш вклад, оба! Все версии, которые вы предоставили, работают нормально - требуется только комментарий, чтобы преобразовать dats $ species в символ до работы str_detect. Обычно предпочитают базовые версии R для скорости, но в этом случае str_detect был очень быстрым и легким синтаксисом. –

Смежные вопросы