2013-06-29 40 views
10

如果我有两个数据帧,如:如何在不添加“Row.names”列的情况下按行名合并数据框?

df1 = data.frame(x=1:3,y=1:3,row.names=c('r1','r2','r3')) 
df2 = data.frame(z=5:7,row.names=c('r5','r6','r7')) 

R> df1 
    x y 
r1 1 1 
r2 2 2 
r3 3 3 

R> df2 
    z 
r5 5 
r6 6 
r7 7 

),我想用行名称合并它们,藏在心里(这样的外部连接,或所有= T)。该做的:

merged.df <- merge(df1,df2,all=T,by='row.names') 
R> merged.df 
    Row.names x y z 
1  r1 1 1 NA 
2  r2 2 2 NA 
3  r3 3 3 NA 
4  r5 NA NA 5 
5  r6 NA NA 6 
6  r7 NA NA 7 

,但我想要的输入行名在输出数据帧(merged.df)该行的名称。

我可以这样做:

rownames(merged.df) <- merged.df[[1]] 
merged.df <- merged.df[-1] 

其工作原理,但似乎不太优雅又难记。任何人都知道更清洁的方式?

+3

你的例子data.frames没有共同的行,使相当不寻常的例子为'merge',是故意的吗? – flodel

+0

不是故意的,对此很抱歉。 – user116293

回答

1

merge帮助:

如果匹配的参与行的名字,叫 Row.names在左侧增加了一个额外字符列,并在所有情况下,结果有 “自动”排名。

所以很明显,你不能避免Row.names列至少使用merge。但是,也许要删除此列,您可以按名称而不是按索引进行分组。例如:

dd <- merge(df1,df2,by=0,all=TRUE) ## by=0 easier to write than row.names , 
            ## TRUE is cleaner than T 

然后我用row.names于子集是这样的:如果

res <- subset(dd,select=-c(Row.names)) 
rownames(res) <- dd[,'Row.names'] 
    x y z 
1 1 1 NA 
2 2 2 NA 
3 3 3 NA 
4 NA NA 5 
5 NA NA 6 
6 NA NA 7 
11

不知道它的任何容易记住,但你可以使用transform做到这一切在一个步骤。

transform(merge(df1,df2,by=0,all=TRUE), row.names=Row.names, Row.names=NULL) 
# x y z 
#r1 1 1 NA 
#r2 2 2 NA 
#r3 3 3 NA 
#r5 NA NA 5 
#r6 NA NA 6 
#r7 NA NA 7 
+0

+1!尽量记住... – agstudy

+0

不错,这是'内部'不能做的事情。 –

相关问题