r - grepl, найдите во фрейме данных список шаблонов и обратите внимание на строки, в которых был найден каждый шаблон.

Я надеюсь, что это простое исправление, которого я просто не вижу... У меня есть функция, которая ищет список шаблонов во фрейме данных, а затем сохраняет вывод в виде TSV:

dfSubset <- df[apply(df, 1, function(i) any(grepl(paste(my.list, collapse="|"), i))),]
write_tsv(dfSubset, "dfSubset.txt", col_names=TRUE)

Мне нужно добавить к этому функцию, которая создаст еще один столбец в окончательном фрейме данных, dfSubset, и вставит поисковый запрос из my.list рядом со строкой, где каждый поисковый запрос был найден.

Вот некоторые поддельные данные, которые я использовал из ответа на другой пост от eipi10:

my.list <- c("035", "566", "60883", "6110", "6752", "6751", "680","681","682","683","684","684",
           "685","686", "7048", "70583","7070", "7078", "7079", "7071", "7280", "72886", 
           "7714", "7715", "7854", "9583", "99662", "99762", "9985")

# Fake data
set.seed(10)
df = as.data.frame(replicate(5, sample(c(my.list, 1e5:(1e5+1000)),10)), stringsAsFactors=FALSE)

Вот пример желаемого вывода, обратите внимание на столбец pattern_found:

   V1     V2     V3     V4     V5     Pattern_found
3 100409 100087 100767 100145   7048     7048
4 100682 100583 100336 100895 100719     682
7 100252 100024 100829 100813   7078     7078

Спасибо за вашу помощь и предложения.


person Phil_T    schedule 24.01.2017    source источник
comment
что такое SSTI.list?   -  person Sotos    schedule 24.01.2017
comment
SSTI.list — это опечатка, и теперь он заменен на my.list.   -  person Phil_T    schedule 24.01.2017
comment
Я не уверен, что полностью понимаю, как должен выглядеть вывод.   -  person Haboryme    schedule 24.01.2017
comment
желаемый результат добавлен   -  person Phil_T    schedule 24.01.2017


Ответы (2)


Попробуй это:

library(stringr)
rgx = paste(my.list, collapse='|')

dfSubset$Pattern_found = apply(dfSubset, 1, function(i) str_extract(paste(i, collapse=','), rgx))

> dfSubset
#       V1     V2     V3     V4     V5 Pattern_found
# 3 100409 100087 100767 100145   7048          7048
# 4 100682 100583 100336 100895 100719           682
# 7 100252 100024 100829 100813   7078          7078
person sirallen    schedule 24.01.2017

Идея с добавлением базы R к вашему dfSubset,

ind <- unlist(sapply(my.list, function(i) grep(i, do.call(paste, dfSubset))))
data.frame(dfSubset[as.integer(ind),], Pattern_found = names(ind))

#      V1     V2     V3     V4     V5 Pattern_found
#4 100682 100583 100336 100895 100719           682
#3 100409 100087 100767 100145   7048          7048
#7 100252 100024 100829 100813   7078          7078

или используя stringi с нуля векторизованным способом,

library(stringi)
df$new <- stri_extract_all_regex(do.call(paste, df), paste(my.list, collapse = '|'), simplify = TRUE)[,1]
df[!is.na(df$new),]

#      V1     V2     V3     V4     V5  new
#3 100409 100087 100767 100145   7048 7048
#4 100682 100583 100336 100895 100719  682
#7 100252 100024 100829 100813   7078 7078
person Sotos    schedule 24.01.2017