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.
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
Ahh, ziemlich erstaunlich: D – Adamm
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