2016-07-21 22 views
0

Ich habe einen Vektor von diesen Saiten zusammen:finden Zahlen und Buchstaben in einem Vektor

10I/V/F/R, 16E, 20R/M/T/I, 24I, 32I, 33F/I/V, 36I/L/V,45R, 46I/L/V, 48M/V, 53L, 
54L/M/V, 60E, 63P, 71V/T/I,73C/S/T/A, 82A/F/I/S/T/M/L/C, 84A/C/V,85V, 88D/T/S, 89M/V/Q/T, 90M 

Und ich habe eine andere wie folgt aus:

10F, 20M, 33F, 82A, 89Q, 93K 

Ich mag, wenn jeder Zeichenfolge zu überprüfen, würde meiner zweiter Vektor existiert in der ersten. In diesem Beispiel gilt dies für die ersten fünf, da für jede Nummer der zugehörige Buchstabe vorhanden ist. Ich möchte als Antwort die Anzahl der Zeichenfolgen erhalten, die übereinstimmen, in diesem Fall 5.

+3

kühlen. Was hast du probiert? –

+0

Die zwei hier vorgestellten Ideen funktionierten! –

Antwort

1

Wir können die Suchzeichenfolgen in Regexes transformieren und dann jede gegen den Zielvektor anpassen. Da Sie die Anzahl der übereinstimmenden Suchzeichenfolgen festlegen möchten, können wir zählen, wie viele Suchzeichenfolgen mindestens eine Übereinstimmung im Zielvektor hatten.

sum(lengths(lapply(sub('^([0-9]+)([a-zA-Z])$','^\\1.*\\2',b),grep,a))>0L); 
## [1] 5 

Daten

a <- c('10I/V/F/R','16E','20R/M/T/I','24I','32I','33F/I/V','36I/L/V,45R','46I/L/V','48M/V', 
'53L','54L/M/V','60E','63P','71V/T/I,73C/S/T/A','82A/F/I/S/T/M/L/C','84A/C/V,85V','88D/T/S', 
'89M/V/Q/T','90M'); 
b <- c('10F','20M','33F','82A','89Q','93K'); 
+0

Vielen Dank! Es klappt!!! –

1

Zuerst extrahieren wir alle Ziffern in v1 und speichern sie in l1 und wir extrahieren alle Alpha und speichern sie in l2. Wir kombinieren dann die beiden in lst mit mapply() und paste0(). Schließlich haben wir eine Schleife über v2 und sum() alle Spiele von grepl()TRUE

library(stringi) 

l1 <- stri_extract_all_regex(v1, "[:digit:]+") 
l2 <- stri_extract_all_regex(v1, "[:alpha:]") 
lst <- mapply(function(x, y) paste0(x, y), l1, l2) 

sum(sapply(v2, function(x) grepl(x, lst))) 

Rückkehr Welche gibt:

#[1] 5 

Daten

v1 <- c("10I/V/F/R", "16E", "20R/M/T/I", "24I", "32I", "33F/I/V", 
     "36I/L/V", "45R", "46I/L/V", "48M/V", "53L", "54L/M/V", 
     "60E", "63P", "71V/T/I", "73C/S/T/A", "82A/F/I/S/T/M/L/C", 
     "84A/C/V", "85V", "88D/T/S", "89M/V/Q/T", "90M") 

v2 <- c("10F", "20M", "33F", "82A", "89Q", "93K"); 
+0

Vielen Dank! Es klappt!!! –

+0

@ LetíciaRaposo Froh, dass es geholfen hat :) –

Verwandte Themen