複数のデータ フレームをマージしようとしているときに、非常に奇妙なものが得られます。ヘルプ!
「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, ] の使用中に失敗します。
問題の原因となるテストデータが思いつかないようです。誰かが以前にこの問題を抱えていましたか? マージする方法について何か良いアイデアはありますか?