6

複数のデータ フレームをマージしようとしているときに、非常に奇妙なものが得られます。ヘルプ!

「RID」列と「VISCODE」列で一連のデータ フレームをマージする必要があります。以下に例を示します。

d1 = data.frame(ID = sample(9, 1:100), RID = c(2, 5, 7, 9, 12),
            VISCODE = rep('bl', 5),
            value1 = rep(16, 5))

d2 = data.frame(ID = sample(9, 1:100), RID = c(2, 2, 2, 5, 5, 5, 7, 7, 7),
            VISCODE = rep(c('bl', 'm06', 'm12'), 3),
            value2 = rep(100, 9))

d3 = data.frame(ID = sample(9, 1:100), RID = c(2, 2, 2, 5, 5, 5, 9,9,9),
            VISCODE = rep(c('bl', 'm06', 'm12'), 3),
            value3 = rep("a", 9),
            values3.5 = rep("c", 9))

d4 = data.frame(ID =sample(8, 1:100), RID = c(2, 2, 5, 5, 5, 7, 7, 7, 9),
            VISCODE = c(c('bl', 'm12'), rep(c('bl', 'm06', 'm12'), 2), 'bl'),
            value4 = rep("b", 9))

dataList = list(d1, d2, d3, d4)

「ループを使用して複数の data.frames を 1 つの data.frame にマージする」というタイトルの質問に対する回答を確認しました。そこで提案されたreduceメソッドと、私が書いたループを使用しました:

try1 = mymerge(dataList)

try2 <- Reduce(function(x, y) merge(x, y, all= TRUE,
by=c("RID", "VISCODE")), dataList, accumulate=F)

ここで、dataList はデータ フレームのリストで、mymerge は次のとおりです。

mymerge = function(dataList){

L = length(dataList)

mdat = dataList[[1]]

  for(i in 2:L){

    mdat = merge(mdat, dataList[[i]], by.x = c("RID", "VISCODE"),
                                  by.y = c("RID", "VISCODE"), all = TRUE)
  }

mdat
}

テスト データと実際のデータのサブセットについては、どちらも正常に機能し、まったく同じ結果が得られます。ただし、データのより大きなサブセットを使用すると、両方が壊れて次のエラーが表示されます: match.names(clabs, names(xi)) のエラー: 名前が以前の名前と一致しません。

本当に奇妙なことは、これを使用するとうまくいくということです:

  dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            faq[1:47, ])

そして、これを使用すると失敗します:

  dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            faq[1:48, ])

私が知る限り、FAQ の 48 行目に特別なことは何もありません。同様に、これを使用すると次のように機能します。

dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            pdx[1:47, ])

そして、これを使用すると失敗します:

dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            pdx[1:48, ])

faq の行 48 と pdx の行 48 は、RID と VISCODE の値が同じで、EXAMDATE (一致していないもの) の値が同じで、ID (一致していない別のもの) の値が異なります。一致する RID と VISCODE 以外に、それらについて何か特別なことがわかります。それらは他の変数名を共有しません。この同じシナリオは、データの他の場所でも問題なく発生します。

複雑なケーキにアイシングを追加するには、これも機能しません。

dataList = list(demog[1:50,],
            neurobat[1:50,],
            apoe[1:50,],
            mmse[1:50,],
            faq[1:48, 2:3])

ここで、列 2 と 3 は「RID」と「VISCODE」です。

これが機能するため、48はマジックナンバーではありません。

 dataList = list(demog[1:500,],
            neurobat[1:500,],
            apoe[1:500,],
            mmse[1:457,])

mmse[1:458, ] の使用中に失敗します。

問題の原因となるテストデータが思いつかないようです。誰かが以前にこの問題を抱えていましたか? マージする方法について何か良いアイデアはありますか?

4

1 に答える 1

1

残念ながら私が助けることができるかどうかはわかりませんが、このエラーの助けを探しているのを見つけたので、投稿すると思いました。私が効果的に持っていたのは:

a <- cbind(b,c)
d <- merge(a,e)

そして、私は同じエラーを受け取りました。を使用しa <- data.frame(b,c)て問題を修正しましたが、理由がわかりません。

object.size(a);1248124200 bytes

object.size(c);1248124032 bytes

だから何かが違う。すべてのクラスは同じであり、str()何も明らかにしません。私は困惑しています。

うまくいけば、それは知っている他の誰かを助けるでしょう。

于 2011-02-21T03:53:59.073 に答える