2012-04-09 13 views
1

Ich habe versucht, dies zu tun, aber nicht überall. Jede Hilfe wird sehr geschätzt.Abrufen von übereinstimmenden Zeilen zwischen zwei Datenrahmen mit For-Schleife

df1 <- data.frame(chrom = "chr1", start=c(10,20,30), end = c(100,200,300), stringsAsFactors=FALSE) 
df2 <- data.frame(chrom = c("chr1", "chr2", "chr3"),start=c(15,500,150), end = c(75,1000,300), stringsAsFactors=FALSE) 

Ich möchte alle Zeilen von DF2 bekommen, wo df1$chrom == df2$chrom. Oder noch besser: Ich möchte die Ausgabe in einem neuen Vektor erzeugen und die Zeilen von df1 gefolgt von df2 oder umgekehrt anzeigen, wobei df1$chrom == df2$chrom.

Ich habe versucht, diese ein for-Schleife wie folgt:

for(i in 1:nrow(df2)){ 
    x[i] <- df2[which(df1$chrom == df2$chrom[i])] 
} 

Problem!

+0

Was versuchen Sie mit diesem Vergleich zwischen Datenrahmen zu erreichen? Es kann einfach eine einfachere Lösung für Ihren Arbeitsablauf geben als die Vorgehensweise, die Sie vornehmen - wenn Sie also beispielsweise nur einen Vektor aus einem Datenrahmen haben wollen, werden Sie viele solcher Vektoren benötigen? Ein neuer Datenrahmen? Was ist das Endziel? Dieser Kontext ist wichtig für die Fragen, die Sie stellen. –

Antwort

3

Ist das was du willst?

Pro Kommentar möchten Sie vielleicht auch Folgendes versuchen.

merge(df1, df2, by = 'chrom') 

Dies wird eine Datenbank "Join" auf den beiden Frames ("Tabellen") tun. Das Ergebnis ist dies.

chrom start.x end.x start.y end.y 
1 chr1  10 100  15 75 
2 chr1  20 200  15 75 
3 chr1  30 300  15 75 

Es ist nicht immer ein effizienter Ansatz, um R aufzunehmen, aber es ist bequem. Sie können die ".x" -Stücke mit Parametern steuern (siehe Hilfeseiten:? Merge). Wenn Sie möchten, dass alle Felder von df2 enthalten sind, können Sie die Parametereinstellung "all = TRUE" hinzufügen.

Wie ich bereits erwähnt habe, ist es am besten, den Gesamtansatz zu betrachten. Dies ist nicht unbedingt ein effizienter Weg, um Ihre Daten zu verarbeiten, da Sie nun eine Menge Redundanz in den resultierenden Frame eingegeben haben. In Datenbankbegriffen denken wir stattdessen an df2 als "Nachschlagetabelle". Der "chr1" in df1 verweist auf Informationen in df2 (einem Fremdschlüssel), der df1 zugeordnet ist, sich aber von ihm unterscheidet. Anstatt, wie die obige Zusammenführung zeigt, die Information von df2 wiederholt zu haben, können wir einfach darauf zugreifen, wenn dies erforderlich ist. Dies ist, wo die Zusammenführung das bequem macht.

+0

Ja, das ist genau das Format, das ich möchte. Es wird nett sein, die übereinstimmenden Reihen beider Datenrahmen nebeneinander in einem neuen Datenrahmen mit 6 Spalten zu haben. Eigentlich ist mein ultimatives Ziel viel komplizierter, wenn der Vergleich durchgeführt wird, der viele Bedingungen zwischen den zwei Datenrahmen erfüllt. Die obige Bedingung ist nur eine von ihnen. – user1079898

+0

Die von Ihnen gesendete Anweisung funktioniert sehr gut. Vielen Dank. Es fällt mir schwer, meinen Kopf darum zu wickeln ... aber es funktioniert! Vielen Dank – user1079898

+0

Es ist zunächst schwer zu bekommen (vor allem, wenn Sie an eine andere Sprache gewöhnt sind, die Schleifen verwendet), aber sobald Sie es bekommen, ist es ziemlich einfach. Wenn Sie mehrere Bedingungen haben, denken Sie an '% in%' und die logischen Operatoren '' 'und' | 'sind großartige Werkzeuge für die Indexierung. Dies ist die Methode, die Bryan zeigte (anstatt einer expliziten Schleife). –

Verwandte Themen