2016-07-25 32 views
3

EDIT: Ich verstehe, die Frage der Zusammenführung mehrerer Datenframes wurde zuvor gefragt, aber ich war fest auf wie mehrere Tabellen ohne Umwandlung in Datenrahmen zuerst, um prägnanter zu sein. Wenn Sie sehen möchten, wie Sie mehrere Datenrahmen zusammenführen, lesen Sie bitte die große Antwort here (auch unten verlinkt).Mischen mehrerer Tabellen in R

So habe ich eine Möglichkeit, mehrere Datenrahmen in R bereits zusammenzuführen, aber ich hoffe, dass jemand mir helfen kann, einen Weg zu finden, der eleganter ist. Hier ist ein Beispiel für Code, den ich habe, der funktioniert. Da DF1, DF2 und DF3 sind Datenrahmen mit identischen Spalten (einschließlich Spaltenname ‚Klasse‘), aber eine unterschiedliche Anzahl von Zeilen kann ich tun:

table1 <- table(df1$class) 
table2 <- table(df2$class) 
table3 <- table(df3$class) 

und wie durch this Antwort gegeben, kann ich dann fusionieren sie:

merged.table <- Reduce(function(...) merge(..., all=T), list(table1, table2, table3)) 

Mein Problem ist, dass die Zusammenführung nicht korrekt ist, da die Objekte Tabelle 1, Tabelle 2 und Tabelle 3 identische Identifikationsnamen sind und die merged.table endet die Daten an einer Spalte verbinden.

Meine Abhilfe ist, um die Tabellen zu Datenrahmen, die als solche zu konvertieren:

table1 <- as.data.frame(table(df1$class)) 
colnames(table1) <- c("ID","counts1") 
table2 <- as.data.frame(table(df2$class)) 
colnames(table2) <- c("ID","counts2") 
table3 <- as.data.frame(table(df3$class)) 
colnames(table3) <- c("ID","counts3") 

Dann wird die Zusammenführung ganz gut funktioniert. Aber lass mich dir sagen, das wird nach einer Weile sehr klobig und langweilig, und ich muss so etwas sehr oft machen.

Gibt es eine Möglichkeit, dasselbe Ziel zu erreichen, ohne Tabellen in Datenrahmen umzuwandeln und Spaltennamen zuzuordnen?

Hier ist ein Beispiel dafür, was der Datenrahmen aussieht, verkürzte der Einfachheit halber:

transcript <- rep(c("a","b","c","d","e","f")) 
family <- rep(c("L1","L2","ERV"),2) 
class <- rep(c("LINE","LINE","LTR"),2) 

df1 <- data.frame(transcript, family, class) 

transcript family class 
a   L1  LINE 
b   L2  LINE 
c   ERV LTR 
d   L1  LINE 
e   L2  LINE 
f   ERV LTR 
+0

Great! Der 'by =" Var1 "Trick hat super funktioniert. Kannst du es als Antwort lassen, damit ich es annehmen kann? – lmrta

Antwort

2

Wir werden by = "Var1" Argument hinzufügen müssen fusionieren:

# dummy data 
transcript <- rep(c("a","b","c","d","e","f")) 
family <- rep(c("L1","L2","ERV"),2) 
class <- rep(c("LINE","LINE","LTR"),2) 
df1 <- data.frame(transcript, family, class) 

# get table as data.frame 
table1 <- as.data.frame(table(df1$class)) 
table2 <- as.data.frame(table(df1$class)) 
table3 <- as.data.frame(table(df1$class)) 

# merge without by 
Reduce(function(...) merge(..., all = TRUE), 
     list(table1, table2, table3)) 
# Var1 Freq 
# 1 LINE 4 
# 2 LTR 2 

# merge with by = "Var1" 
Reduce(function(...) merge(..., all = TRUE, by = "Var1"), 
     list(table1, table2, table3)) 

# Var1 Freq.x Freq.y Freq 
# 1 LINE  4  4 4 
# 2 LTR  2  2 2 
+0

Das 'By' Statement ist auch im Dupe selbst vorhanden ... Sieht für mich aus, als hätte ich die Antwort nicht sorgfältig genug gelesen –

+0

@DavidArenburg oops, lass es dann als dupe schließen. – zx8754

Verwandte Themen