2013-06-29 28 views
10

Nếu tôi có hai khung dữ liệu, chẳng hạn như:Làm cách nào để hợp nhất các khung dữ liệu theo tên hàng mà không thêm cột "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ôi muốn kết hợp chúng bằng tên hàng, giữ tất cả mọi thứ (vì vậy một bên ngoài tham gia, hoặc tất cả = T). Điều này thực hiện:

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 

nhưng tôi muốn tên hàng nhập là tên hàng trong dataframe đầu ra (merged.df).

tôi có thể làm:

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

mà làm việc, nhưng dường như không thanh nha và khó nhớ. Bất cứ ai biết một cách sạch hơn?

+3

Ví dụ về dữ liệu của bạn.frames không có hàng nào chung, tạo một ví dụ khác thường cho 'hợp nhất', có chủ ý không? – flodel

+0

Không cố ý, xin lỗi về điều đó. – user116293

Trả lời

1

Từ sự giúp đỡ của merge:

Nếu phù hợp liên quan đến tên hàng, một cột nhân vật phụ được gọi là Row.names được thêm vào ở bên trái, và trong mọi trường hợp kết quả có hàng 'tự động' tên.

Vì vậy, rõ ràng là bạn không thể tránh cột Row.names ít nhất bằng cách sử dụng merge. Nhưng có thể để loại bỏ cột này, bạn có thể tập hợp theo tên chứ không phải theo chỉ mục. Ví dụ:

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

Sau đó, tôi sử dụng row.names để tập hợp con như thế này:

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

Không chắc nếu nó bất kỳ dễ nhớ hơn, nhưng bạn có thể làm điều đó tất cả trong một bước bằng 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! cố gắng ghi nhớ ... – agstudy

+0

Tốt, đây là thứ gì đó 'bên trong' không thể làm được. –

Các vấn đề liên quan