1

この質問の続きとして、マージ時に y データ フレームから一意でない変数のみをマークする方法を探しています。

のデフォルトsuffixesは、長さが 2 のベクトルを探すことです。

このリストがあるとします。

a <- list(A = data.frame(id = c(01, 02), a=runif(2), b=runif(2)), 
          B = data.frame(id = c(01, 02), b=runif(2), c=runif(2)),
          C = data.frame(id = c(01, 02), c=runif(2), d=runif(2)))
a
$A
  id         a         b
1  1 0.6922513 0.9966336
2  2 0.9216164 0.8256744

$B
  id         b         c
1  1 0.2242940 0.7058331
2  2 0.4474754 0.9228213

$C
  id        c         d
1  1 0.969796 0.1761250
2  2 0.633697 0.6618188

次に、いくつかのデータ フレームを 1 つずつマージするカスタマイズを行います。ここでは、1 つのデータ フレームを取り出して例を示します。

df <- a[[1]]
a <- a[setdiff(names(a), names(a[1]))]

次に、この方法でリストをマージします。

for(i in seq_along(a)) {
   v <- a[[i]]     # extract value
   ns <- names(a)
   n <- ns[[i]]    # extract name
   df <-merge(df, v, by.x="id", by.y="id", all.x=T, 
              suffixes=paste(".", n, sep = ""))
}
df
  id         a       b.B       bNA       c.C      cNA         d
1  1 0.6922513 0.9966336 0.2242940 0.7058331 0.969796 0.1761250
2  2 0.9216164 0.8256744 0.4474754 0.9228213 0.633697 0.6618188

問題は、上に示したように、R が一意でない変数の両方にマークを追加することですが、1 つの名前しか指定しnなかったためNA、「他の」変数にマークが付けられます。上記の例では、A データ フレームから変数に .B サフィックスを取得します。

正しいデータ フレーム名を両方の変数に追加するか、(推奨) マージ時に y の変数を排他的にマークする方法はありますか?

4

2 に答える 2

2

これは楽しい小さなパズルでした。reshapeパッケージの Hadley のmerge_recurse関数をだまし、「借用」しました。

merge_recurse1 <- function (dfs, ...) 
{
    n <- length(dfs)
    if (!is.null(names(dfs))){

    }
    if (length(dfs) == 2) {
        merge(dfs[[1]], dfs[[2]],all = TRUE,sort = FALSE,
            suffixes = c('',names(dfs)[2]), ...)
    }
    else {
        merge(Recall(dfs[-n],...), dfs[[n]],all = TRUE,sort = FALSE,
            suffixes = c('',names(dfs)[n]),...)
    }
}

> merge_recurse1(a,by = "id")
  id         a         b        bB         c        cC         d
1  1 0.2536158 0.6083147 0.3060572 0.1428531 0.6403072 0.4621454
2  2 0.9839910 0.7256161 0.2203161 0.6653415 0.1496376 0.8767888

サフィックスの変更に加えて、思った通りに動作させるには...引数を追加する必要があることがわかりました。それがバグなのか、機能を誤解しているだけなのかはわかりません。Recallmerge_recurse

于 2012-04-29T05:36:21.757 に答える
1

申し訳ありません...あなたの問題を理解するのに少し時間がかかりました。でも、あなたは... 99%そこにいます。

引数を変更します。

suffixes = paste(".", n, sep = "")

に:

suffixes = c("", paste(".", n, sep = ""))

そして、あなたは大丈夫なはずです。これを行うことで、df次のようなものが得られました。

> df
  id          a           b        b.B         c        c.C           d
1  1 -0.6039805  0.08297807 0.06426459  2.787147 -0.9566280 -0.36054991
2  2 -0.1694382 -0.95296450 0.37144139 -1.346691  0.7072892  0.09239593

ところで、これらすべての代わりに、以前の Stackoverflow の投稿にある他の推奨事項をいくつか試してみましたか? どこかでReduce、この部分的な解決策(元の「a」データを使用)を使用して何かを見たのを覚えています:

Reduce(function(x, y) merge(x, y, by="id", all=TRUE, suffixes=c("", "_2")), 
       a, accumulate=FALSE)

次のような出力が得られます。

  id          a           b        b_2         c        c_2           d
1  1 -0.6039805  0.08297807 0.06426459  2.787147 -0.9566280 -0.36054991
2  2 -0.1694382 -0.95296450 0.37144139 -1.346691  0.7072892  0.09239593

これらのいずれかがより便利ですか、それとも探しているものに近いですか?

于 2012-04-30T16:41:16.573 に答える