2017-04-13 2 views
1

Ich versuche immer noch, Funktionen in R zu verstehen, wie apply, lapply usw. Soweit ich weiß, sind Schleifen in R langsam und es ist eine gute Übung, sie zu vermeiden. Es ist jedoch ziemlich schwierig, One-Line-Skripte zu erstellen, die alles machen. Nichtsdestotrotz möchte ich Loops vergessen und auf schnelle Funktionen umstellen. Meine Eingangsdaten - zwei Tabellen:Verschachteltes Lapply, um Tabellen statt Schleifen zu ändern

L1

N Q string 
1 12 NNN|ABC|12.5 
2 46 DEF|111|!-2 
3 34 $$%GHI|--+ 
4 -2 345H*(JKL 
5 50 NK-|224ABC 
6 0 NNNNNNNNN 

und L2

str 
ABC 
DEF 
GHI 
JKL 
MNO 
PRS 

Was ich zu bekommen:

N Q string   sub 
1 12 NNN|ABC|12.5 ABC 
2 46 DEF|111|!-2  DEF 
3 34 $$%GHI|--+ GHI 
4 -2 345H*(JKL  JKL 
5 50 NK-|224ABC  ABC 
6 0 NNNNNNNNN  NA 

Wie Sie spezifische sehen su bstring wird aus einer Zeichenfolge extrahiert (sehr zufällig, ohne Vorlage) und am Ende jeder Zeile hinzugefügt.

Ich habe ein kurzes Skript in R mit Schleifen, die dies ermöglicht, aber in meiner nicht-gefälschten Datentabelle hat L1 über 80000 Zeilen und Tabelle L2 bis zu 250000 Zeilen, so dass diese einfache Operation ein bisschen Zeit brauchen kann .

L1 <- cbind(sub=NA,L1) 
L1 <- subset(L1, select=c(N:string,sub)) 
for(i in 1:nrow(L2)){ 
    for(j in 1:nrow(L1)){ 
    if(grepl(L2[i,1], L1[j,3])){ 
     L1$sub[j] <- toString(L2$str[i]) 
    } 
    } 
} 

Ich habe über verschachteltes Lapply nachgedacht, aber wie komme ich zum spezifischen Index? Ultra-Pseudo-Code:

lapply(L1, function(x) lapply(L2, function(y) if(L2 in L1) add L2 to L1 else add NA)) 

Bier und großer Dank für jede Ahnung.

Antwort

3

Wir str_extract

library(stringr) 
L1$sub <- str_extract(L1$string, paste(L2$str, collapse="|")) 
L1$sub 
#[1] "ABC" "DEF" "GHI" "JKL" "ABC" NA 
+2

verwenden Wenn Sie die Möglichkeit erklären wollen, dass ein String in L1 kann in L2 mehr als ein Muster passen (zB 'L1 $ string [1] <-„NNN | ABC | DEF | 12.5 "') Sie könnten 'str_extract_all' verwenden:' L1 $ sub <- stringr :: str_extract_all (L1 $ string, einfügen (L2 $ str, collapse = "|"))%>% lapply (einfügen, reduzieren = ",")%>% unlist%>% replace (.,. == "", NA) '. – ikop

+1

Ahh, ziemlich erstaunlich: D – Adamm

+1

Ich möchte nur eine Sache hinzufügen. Nach kleinen Modifikationen meiner Lösung und der obigen Lösung, habe ich beide Skripte auf meinen Daten ausgeführt und den Zeitunterschied gemessen: Meine Lösung: ** Zeitunterschied von 48.31354 Min. ** Gegebene Lösung: ** Zeitunterschied von 30.6875 Sek. **. Noch einmal, vielen Dank! – Adamm

Verwandte Themen