2017-01-24 3 views
1

Ich hoffe, dies ist eine einfache Lösung, die ich gerade nicht sehe ... Ich habe eine Funktion dass sucht eine Liste von Mustern über einen Datenrahmen und speichert dann die Ausgabe als TSV:r - grepl, suchen Sie einen Datenrahmen nach einer Liste von Mustern und notieren Sie die Zeile (n), die jedes Muster gefunden wurde

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

ich brauche eine Funktion, um diese hinzuzufügen, die eine andere Spalte in dem letzten Datenrahmen zu schaffen, dfSubset, und fügen Sie die Suchbegriff aus my.list neben der Zeile, in der jeder Suchbegriff gefunden wurde.

Hier sind einige gefälschte Daten, die ich auf eine andere Stelle habe von eipi10 aus einer Antwort mit:

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) 

Hier ist ein Beispiel für die gewünschte Ausgabe, beachten Sie die pattern_found Spalte:

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 

Vielen Dank für Ihre Hilfe und Vorschläge.

+0

was ' SSTI.list'? – Sotos

+0

SSTI.list ist ein Tippfehler und wird jetzt geändert in my.list –

+0

Ich bin mir nicht sicher, ob ich vollständig verstehe, wie die Ausgabe aussehen soll. – Haboryme

Antwort

1

Try this:

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

Eine Idee mit Base R Zugabe auf 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 

oder mit stringi von Grund auf in einem vektorisierten Weise

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 
Verwandte Themen