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