簡體   English   中英

如何在不添加“Row.names”列的情況下按行名合並數據幀?

[英]How does one merge dataframes by row name without adding a “Row.names” column?

如果我有兩個數據框,例如:

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]

這有效,但似乎不優雅,難以記住。 有人知道更清潔的方式嗎?

不確定它是否更容易記住,但您可以使用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

merge的幫助:

如果匹配涉及行名稱,則在左側添加一個名為Row.names的額外字符列,並且在所有情況下結果都具有“自動”行名稱。

所以很明顯,你至少不能使用merge來避免Row.names列。 但也許要刪除此列,您可以按名稱而不是索引進行子集化。 例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM