Ich habe zwei Datenrahmen, SCR und SpecificSpecies. Die Namen der SCR-Artikel enthalten zum Teil die in Specific Species aufgeführten Arten.Effiziente Möglichkeit, über zwei Listen zu iterieren (Nested Loop Alternative)
SpecificSpecies$Species
S cerevisiae
Daucus carota
SCR$MESH_HEADINGS
tetracycline CMT-3
zrg17 protein, S cerevisiae
EP4 glycoprotein, Daucus carota
Ich versuche Teilmenge von SCR zu erhalten, die nur die Einträge enthalten, die keine passende Spezies nicht haben. Im obigen Fall würde diese Liste nur
seintetracycline CMT-3.
Die Art und Weise habe ich gelernt, dies zu tun, wäre mit verschachtelten Schleifen, jeden Eintrag in SCR zu jedem Eintrag in SpecificSpecies zu vergleichen. Wenn keine Übereinstimmung gefunden wird, hängen die Reihe der SCR in eine neue Tabelle:
For each row in SCR {
SpeciesNumber <- 1
match <-NULL
while ((is.null(match)) & (SpeciesNumber < length(SpecificSpecies$Species))) {
if (grepl(SpecificSpecies$Species[SpeciesNumber], SCR[row,]$MESH_HEADING)){
match <- TRUE}
SpeciesNumber <- SpeciesNumber + 1}
if ((is.null(match) & SpeciesNumber == length(SpecificSpecies$Species)) {
speciesNoMatch = rbind(speciesNoMatch, SCR[row])}
}}
Aber das ist quälend langsam mit 65.000 Einträgen in SCR und etwa 1500 in SpecificSpecies. Gibt es eine Möglichkeit so zu nisten? Oder eine andere Funktion, die mir hier nicht vertraut ist?
Ich bin sicher, das ist schrecklich Code zu beginnen. Ich bin ein medizinischer Bibliothekar, der R manchmal für die Datenanalyse verwenden muss, daher habe ich sehr begrenzte Programmierkenntnisse, aber normalerweise ist es egal, ob meine Lösungen hässlich oder ineffizient sind, solange sie schließlich funktionieren. Ich weiß, dass es einen besseren Weg geben muss, dies zu tun; verzeih mir, dass ich etwas ignoriere, was wahrscheinlich eine einfache Lösung ist.
Nein, ich fürchte nicht. Diese Kommas sind keine Trennzeichen, sie sind Teil der ursprünglichen Zeichenkette. Das heißt, einige der Einträge haben die Form "Protien name, species name". Ich brauche grep oder regex oder etwas ähnliches, um die Matches zu liefern, da die Spezies nur einen Teil des SCR $ MESH_HEADING abdeckt. – NotMyJob
@NotMyJob Ich habe gerade bemerkt, siehe meine Bearbeitung – Phil
Vielen Dank für Ihre Hilfe mit diesem! Zwei Dinge. Zunächst funktioniert Ihr Beispiel für mich, schlägt aber fehl, wenn ich versuche, meine tatsächlichen Daten zu verwenden. Ich bekomme eine Liste von 0 und dann eine leere Tabelle auf der Liste. Irgendeine Idee warum? Zweitens brauche ich den gesamten Datensatz von SCR, wenn ich Teilmenge, nicht nur die MESH_HEADING. Gibt es einen einfachen Weg, um die ganze Reihe zurückzugeben? – NotMyJob