2017-01-24 19 views
1

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

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 

Благодарим вас за помощь и предложения.

+0

что ' SSTI.list'? – Sotos

+0

SSTI.list - это опечатка, и теперь она изменена на my.list –

+0

Я не уверен, что полностью понимаю, как должен выглядеть вывод. – Haboryme

ответ

1

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

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 
1

Идея с базой 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