2013-02-09 69 views
9

我想merge多個data.frame在R使用row.names,做一個完整的外部聯接。爲此,我希望能做到以下幾點:合併多個data.frame中的行R

x = as.data.frame(t(data.frame(a=10, b=13, c=14))) 
y = as.data.frame(t(data.frame(a=1, b=2))) 
z = as.data.frame(t(data.frame(a=3, b=4, c=3, d=11))) 
res = Reduce(function(a,b) merge(a,b,by="row.names",all=T), list(x,y,z)) 

Warning message: 
In merge.data.frame(a, b, by = "row.names", all = T) : 
    column name ‘Row.names’ is duplicated in the result 
> res 
    Row.names Row.names V1.x V1.y V1 
    1   1   a 10 1 NA 
    2   2   b 13 2 NA 
    3   3   c 14 NA NA 
    4   a  <NA> NA NA 3 
    5   b  <NA> NA NA 4 
    6   c  <NA> NA NA 3 
    7   d  <NA> NA NA 11 

我希望得到是:

V1 V2 V3 
    a 10 1 3 
    b 13 2 4 
    c 14 NA 3 
    d NA NA 11 

回答

6

下工作(高達一些最後一列重命名):

res <- Reduce(function(a,b){ 
     ans <- merge(a,b,by="row.names",all=T) 
     row.names(ans) <- ans[,"Row.names"] 
     ans[,!names(ans) %in% "Row.names"] 
     }, list(x,y,z)) 

事實上:

> res 
    V1.x V1.y V1 
a 10 1 3 
b 13 2 4 
c 14 NA 3 
d NA NA 11 

行加入會發生什麼事是與原rownames一列中的答案,這反過來不包含行名稱增加:

> merge(x,y,by="row.names",all=T) 
    Row.names V1.x V1.y 
1   a 10 1 
2   b 13 2 
3   c 14 NA 

此行爲?merge記錄(下值)

如果匹配涉及到行名稱,則在左側添加名爲 的額外字符列,並且在所有情況下結果都有 「自動」行名稱。

Reduce嘗試再次合併,但沒有找到任何匹配,除非該名手動清理。

2

爲了保持連續性,這不是一個乾淨的解決方案,而是一種解決方法,我使用sapply來轉換列表參數'Reduce'。

Reduce(function(a,b) merge(a,b,by=0,all=T), 
         sapply(list(x,y,z),rbind))[,-c(1,2)] 
    x y.x y.y 
1 10 1 3 
2 13 2 4 
3 14 NA 3 
4 NA NA 11 
Warning message: 
In merge.data.frame(a, b, by = 0, all = T) : 
    column name ‘Row.names’ is duplicated in the result 
0

出於某種原因,我沒有與Reduce有太大的成功。給出一個data.frames(df.lst)列表和一個後綴列表(suff.lst)來更改相同列的名稱,這是我的解決方案(它是循環的,我知道它對R標準來說很醜,但它工作正常) :

df.merg <- as.data.frame(df.lst[1]) 
colnames(df.merg)[-1] <- paste(colnames(df.merg)[-1],suff.lst[[1]],sep="") 
for (i in 2:length(df.lst)) { 
    df.i <- as.data.frame(df.lst[i]) 
    colnames(df.i)[-1] <- paste(colnames(df.i)[-1],suff.lst[[i]],sep="") 
    df.merg <- merge(df.merg, df.i, by.x="",by.y="", all=T) 
}