2013-02-09 7 views
9

row.namesを使用して、Rでmerge複数のdata.frameを使用したいと思います。このために私がやって期待していた次複数のデータを行単位でマージする

私は次のようになり得るために期待していた何
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 
行に参加して何が起こる10は、元rownamesと列が順番に行名が含まれていない答えに追加されていることである。

この動作は

(値下) ?mergeに記載されて
> 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 

一致する行の名前がある場合は、 Row.namesという余分な文字列が左側に追加され、いずれの場合も結果は の「自動」行の名前になります。

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)とsuffix(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) 
} 
関連する問題