2016-07-25 55 views
3

編輯:我明白以前問過合併多個數據幀的問題,但我被困在如何合併多個表而沒有先轉換爲數據幀,以便更簡潔。如果您想了解如何合併多個數據框,請參閱最佳答案here(也鏈接如下)。在R中合併多個表

所以我有一種方法可以在R中合併多個數據幀,但我希望有人可以幫助我找到更優雅的方式。這裏是我有這個代碼的例子。鑑於DF1,DF2和DF3都具有相同的列(包括列名「階級」),但不同的行數的數據幀,我可以這樣做:

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

this答案給出的,然後我就可以合併其中:

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

我的問題是,合併不正確,因爲對象表1,表2,表3和具有相同的識別名稱和merged.table最終的數據合併到一列。

我的解決方法是將錶轉換爲數據幀,因爲這樣的:

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") 

然後合併工作得很好。但讓我告訴你,一段時間後,這會變得非常笨重乏味,我需要做很多事情。

有什麼辦法可以實現相同的目標,而無需將表格轉換爲數據框和分配列名稱?

這裏是什麼樣的數據幀的樣子,截斷簡單的例子:

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

太好了! 'by =「Var1」技巧效果很好。你可以把它作爲答案,讓我可以接受它嗎? – lmrta

回答

2

我們將需要添加by = "Var1"參數合併:

# 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

''by'聲明也出現在愚蠢本身......看起來像我只是沒有仔細閱讀答案 –

+0

@DavidArenburg哎呀,讓它關閉它作爲愚蠢。 – zx8754