2016-07-25 165 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