2013-02-10 24 views
9

Tôi có một danh sách các đối tượng mà tôi muốn nối thêm với nhau, tức là merge(..., all=T). Tuy nhiên, merge dường như xóa các tên hàng mà tôi cần giữ nguyên. Bất kỳ ý tưởng? Ví dụ:rbind hai data.frame giữ nguyên thứ tự hàng và tên hàng

x = data.frame(a=1:2, b=2:3, c=3:4, d=4:5, row.names=c("row_1", "another_row1")) 
y = data.frame(a=c(10,20), b=c(20,30), c=c(30,40), row.names=c("row_2", "another_row2")) 
> merge(x, y, all=T, sort=F) 
    a b c d 
    1 1 2 3 4 
    2 2 3 4 5 
    3 10 20 30 NA 
    4 20 30 40 NA 
+0

có thể là z <- hợp nhất (x, y, tất cả = T, sắp xếp = F); rownames (z) <- c (rownames (x), rownames (y)) –

+3

Nếu tôi hiểu bạn đúng, bạn muốn 'rbind' khung dữ liệu của các số cột khác nhau với nhau. [Câu hỏi này] (http://stackoverflow.com/questions/3402371/rbind-different-number-of-columns) có thể hữu ích cho bạn, đặc biệt là 'rbind.fill' từ gói' plyr'. –

+0

@Arun [Câu trả lời của Ananda Mahto] (http://stackoverflow.com/a/14799551/697568) sẽ giải quyết vấn đề đó. –

Trả lời

14

Vì bạn biết bạn không thực sự hợp nhất, nhưng chỉ cần rbind-ing, có thể một cái gì đó như thế này sẽ làm việc. Nó sử dụng số rbind.fill từ "plyr". Để sử dụng, hãy chỉ định một số list của số data.frame mà bạn muốn rbind.

RBIND <- function(datalist) { 
    require(plyr) 
    temp <- rbind.fill(datalist) 
    rownames(temp) <- unlist(lapply(datalist, row.names)) 
    temp 
} 
RBIND(list(x, y)) 
#    a b c d 
# row_1   1 2 3 4 
# another_row1 2 3 4 5 
# row_2  10 20 30 NA 
# another_row2 20 30 40 NA 
11

Một cách là sử dụng row.names để hợp nhất để bạn lấy cột đó làm cột bổ sung.

> merge(x, y, by=c("row.names", "a","b","c"), all.x=T, all.y=T, sort=F) 

#  Row.names a b c d 
# 1  row_1 1 2 3 4 
# 2 another_row1 2 3 4 5 
# 3  row_2 10 20 30 NA 
# 4 another_row2 20 30 40 NA 

Edit: Bằng cách nhìn vào merge chức năng với getS3method('merge', 'data.frame'), các row.names được thiết lập rõ ràng để NULL (nó là một mã khá dài, vì vậy tôi sẽ không dán ở đây).

# Commenting 
# Lines 63 and 64 
row.names(x) <- NULL 
row.names(y) <- NULL 

# and 
# Line 141 (thanks Ananda for pointing out) 
attr(res, "row.names") <- .set_row_names(nrow(res)) 

và tạo ra một chức năng mới, chẳng hạn, MERGE, hoạt động như OP có ý định cho ví dụ này. Chỉ là một thử nghiệm.

+0

+1. Tôi luôn luôn quên về việc có thể hợp nhất trên '" row.names "' – A5C1D2H2I1M1N2O1R2T1

+0

Về chỉnh sửa của bạn, tôi cũng phải loại bỏ dòng 141 ('attr (res," row.names ") <- .set_row_names (nrow (res)) '). Tôi đã đưa ra một ý chính [ở đây] (https://gist.github.com/mrdwab/4750113) có thể được tải và chạy với 'thư viện (devtools); source_gist (4750113); MERGE (x, y, tất cả = TRUE) ', ít nhất một phần là xác thực thử nghiệm của bạn. – A5C1D2H2I1M1N2O1R2T1

+0

Hãy tưởng tượng bạn có một df thứ ba, 'z <- data.frame (a = c (11, 21), b = c (22, 32), d = c (33, 43), row.names = c ("row_3", "another_row3")) '. Làm thế nào chúng ta có thể nhận được 'hợp nhất' thông thường để làm việc (có lẽ với' Reduce', hoặc thậm chí là thủ công)? 'MERGE' hoạt động như mong đợi với' Giảm (hàm (x, y) MERGE (x, y, tất cả = TRUE, sắp xếp = FALSE), danh sách (x, y, z)) '(nhiều hơn hoặc ít hơn - thứ tự cột thay đổi) và 'RBIND (danh sách (x, y, z))' cũng thực hiện thủ thuật. Nhưng tôi không thể tìm ra một giải pháp 'hợp nhất' cơ bản chưa được pha trộn ở đây. Bất kỳ ý tưởng? – A5C1D2H2I1M1N2O1R2T1

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