2013-02-10 94 views
9

我有我想排追加到彼此,即merge(..., all=T)data.frame對象的列表。但是,merge似乎刪除了我需要保持不變的行名稱。有任何想法嗎?例如:rbind 2個data.frame保留行順序和行名稱

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

可能是 z < - merge(x,y,all = T,sort = F); rownames(Z)< - C(rownames(X),rownames(Y)) – 2013-02-10 15:55:43

+3

如果我理解你的權利,你要列數也不同在一起'rbind'數據幀。 [這個問題](http://stackoverflow.com/questions/3402371/rbind-different-number-of-columns)可能對您有所幫助,尤其是'從'plyr'包rbind.fill'。 – 2013-02-10 15:56:58

+0

@阿倫[Ananda Mahto的回答](http://stackoverflow.com/a/14799551/697568)照顧。 – 2013-02-10 17:11:32

回答

14

既然你知道你實際上並沒有合併,而只是rbind-ING,也許這樣的事情會工作。它使用「plyr」中的rbind.fill。要使用它,請指定的list,您要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

一種方法是在合併中使用row.names,以便將其作爲附加列。

> 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 

編輯:通過與getS3method('merge', 'data.frame')merge功能,row.names明確設置爲NULL(這是一個相當長的代碼,所以我不會在這裏貼)。

# 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)) 

,並創建一個新的功能,比如說,MERGE,作品的OP打算在這個例子。只是一個實驗。

+0

+1。我總是忘了能夠對' 「row.names」' – A5C1D2H2I1M1N2O1R2T1 2013-02-10 16:00:14

+0

關於你的編輯合併,我也不得不刪除線141('ATTR(RES 「row.names」<) - .set_row_names(nrow(RES)) ')。我已經提出了一個要點(https://gist.github.com/mrdwab/4750113),可以使用庫(devtools)加載和運行; source_gist(4750113); MERGE(x,y,all = TRUE)',至少部分驗證了你的實驗。 – A5C1D2H2I1M1N2O1R2T1 2013-02-10 16:53:25

+0

讓我們想象你有第三個DF,'ž< - data.frame(A = C(11,21),B = C(22,32),d = C(33,43),row.names = C( 「row_3」,「another_row3」))'。我們如何才能定期使用「merge」工作(或許可以使用'Reduce',或者甚至手動)? 'MERGE'按預期的方式工作,使用'Reduce(函數(x,y)MERGE(x,y,all = TRUE,sort = FALSE),list(x,y,z))'(或多或少 - 列順序改變)和'RBIND(list(x,y,z))'也有訣竅。但是我不能在這裏弄清楚一個沒有摻雜的基礎'合併'解決方案。有任何想法嗎? – A5C1D2H2I1M1N2O1R2T1 2013-02-10 18:44:39