2013-06-29 39 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

不錯,這是'內部'不能做的事情。 –

相關問題