Как объединить файлы данных по имени строки без добавления столбца "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]

который работает, но кажется неэлегантным и трудно запоминающимся. Кто-нибудь знает более чистый способ?

Ответ 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

Ответ 2

С помощью 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