ID が「A」から「J」であるとしましょう。そして、次のように見える 2 つのデータ フレームがあります (ご覧のとおり、2 番目のデータ フレームは対称です)。
df1 <- data.frame(ID = LETTERS[1:5], Var = c(9,13,15,11,28))
df2 <- as.data.frame(matrix(data = c(NA,42,83,74,84,42,NA,26,69,9,83,26,NA,67,95,74,69,67,NA,6,84,9,95,6,NA), ncol = 5, nrow = 5, dimnames = list(df1$ID, df1$ID)))
たとえば、オブジェクト「B」と「E」を考えてみましょう。知りたい: 13+28 (からdf1
) は 9 (から) より小さいdf2
ですか? オブジェクトのすべてのペアについてこれを知りたいです。出力は
(a) およびのようdf2
に構造化された論理データ フレーム
(b) 「TRUE」値の数。
ほとんどの場合、結果 (b) のみが必要ですが、(a) も必要になる場合があります。したがって、(b) が (a) なしで計算でき、これが大幅に高速になる場合は、特定の質問に答える必要がある出力に応じて適切なアルゴリズムを選択するために、両方のアルゴリズムが必要です。
約 2000 個のオブジェクトを比較しているので、アルゴリズムはかなり高速になるはずです。これまでのところ、for
非常に遅い 2 つのネストされたループでしか実装できませんでした。おそらくベクトル化を利用するなど、これを行うためのはるかに優れた方法があるに違いありません。
現在の様子は次のとおりです。
df3 <- as.data.frame(matrix(data = NA, ncol = nrow(df1), nrow = nrow(df1),
dimnames = list(df1$ID, df1$ID)))
for (i in 2:nrow(df3)){
for (j in 1:(i-1)){
sum.val <- df1[df1$ID == rownames(df3)[i], "Var"] + df1[df1$ID == names(df3)[j], "Var"]
df3[i,j] <- sum.val <= df2[i,j]
}
}
#