11

完全外部結合を使用して、R で倍増したいと思いmergeます。このために、私は次のことを望んでいました:data.framerow.names

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
4

3 に答える 3

10

以下は機能します(最終的な列の名前変更まで):

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

行の結合で何が起こるかというと、元の行名を持つ列が回答に追加されますが、これには行名が含まれていません。

> 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(値の下)に記載されています。

マッチングに行名が含まれる場合、Row.names と呼ばれる追加の文字列が左側に追加され、すべての場合において、結果には「自動」の行名が含まれます。

再度マージしようとするReduceと、名前が手動でクリーンアップされない限り、一致するものは見つかりません。

于 2013-02-09T00:54:41.970 に答える
2

継続性のために、これはクリーンな解決策ではありませんが、回避策です。「Reduce」のリスト引数を。を使用して変換しsapplyます。

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
于 2013-02-09T01:03:54.107 に答える
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)
}
于 2013-12-17T18:48:01.307 に答える