2016-05-31 16 views
-1

Ich habe zwei Datenrahmen:vergleichen data.frames mit unterschiedlicher Anzahl für Reihen

df1<- data.frame(POS=c(1, 2, 3, 4, 5), 
      A=c(0.2,0,0,0.8,0), 
      G=c(0,0.3,0,0.2,0.5), 
      T=c(0.4,0.7,1,0,0.5), 
      C=c(0.4,0,0,0,0)) 

df2<- data.frame(POS=c(1, 3, 4, 5, 6), 
      A=c(0.3,0,0.6,0,0), 
      G=c(0,0,0.4,0.7,1), 
      T=c(0.2,1,0,0.3,0), 
      C=c(0.5,0,0,0,0)) 

Ich mag die summierten quadrierten Differenzen für jeden PO

Das erste, was ich sind zwei Matrizen brauche, um von die gleichen Dimensionen. Wie füge ich eine Zeile für die fehlenden Positionen hinzu, die mit Nullen gefüllt sind?

Sobald ich die zwei Matrizen habe, mache ich (df1-df2)^2 gefolgt von einem Zeilensummen-Ansatz.

Zusammenfassend: Wie füge ich eine neue Zeile mit Nullen für die fehlenden Zeilen in jedem data.frame hinzu?

wie folgt aus:

POS A G T C 
1 0.2 0.0 0.4 0.4 
2 0.0 0.3 0.7 0.0 
3 0.0 0.0 1.0 0.0 
4 0.8 0.2 0.0 0.0 
5 0.0 0.5 0.5 0.0 
6 0.0 0.0 0.0 0.0 

POS A G T C 
1 0.3 0.0 0.2 0.5 
2 0.0 0.0 0.0 0.0 
3 0.0 0.0 1.0 0.0 
4 0.6 0.4 0.0 0.0 
5 0.0 0.7 0.3 0.0 
6 0.0 1.0 0.0 0.0 

Antwort

3

von Zheyuan Li in den Kommentaren gesagt Wie können Sie merge() jeder df mit der POS-Spalte des anderen df auf der ersten Spalte (POS) verwendet werden. Dies fügt fehlende Zeilen, die mit NA gefüllt sind, so sie Sie mit Nullen dann füllen müssen:

df1 <- merge(df1, df2$POS, all = TRUE, by=1) 
df1[is.na(df1)] <- 0 
df1 
    POS A G T C 
1 1 0.2 0.0 0.4 0.4 
2 2 0.0 0.3 0.7 0.0 
3 3 0.0 0.0 1.0 0.0 
4 4 0.8 0.2 0.0 0.0 
5 5 0.0 0.5 0.5 0.0 
6 6 0.0 0.0 0.0 0.0 

df2 <- merge(df2, df1$POS, all = TRUE, by=1) 
df2[is.na(df2)] <- 0 
df2 
    POS A G T C 
1 1 0.3 0.0 0.2 0.5 
2 2 0.0 0.0 0.0 0.0 
3 3 0.0 0.0 1.0 0.0 
4 4 0.6 0.4 0.0 0.0 
5 5 0.0 0.7 0.3 0.0 
6 6 0.0 1.0 0.0 0.0 
+0

Diese für das Beispiel funktioniert gegeben, aber ich habe Schwierigkeiten dies in meinen realen Daten zu implementieren. Ich bekomme Fehler im Zusammenhang mit dem "BY". 'Fehler in merge.data.table (Masse, evo $ POS, alle = TRUE, by.x =" POS ", by.y = 1): Für by.x ist ein nicht leerer Vektor von Spaltennamen erforderlich und by.y. " oder" Fehler in merge.data.table (Masse, evo $ POS, alle = TRUE, durch = "POS"): Elemente, die in 'by' aufgelistet sind, müssen gültige Spaltennamen in x und y sein ' –

+0

Können Sie erklären, warum Sie' by = 1' wählen? Mein Verständnis der 'merge()' ist die Verwendung des Spaltennamens (d. H. POS) –