0

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]
  }
}

#

4

3 に答える 3

3

これは、あなたの望むことですか?

df3 <- outer(df1$Var, df1$Var, "+")
df3

df4 <- df3 < df2
df4

sum(df4, na.rm = TRUE)
于 2013-09-04T15:15:20.393 に答える
1

これはあなたが望むことをします。

# Generate the data
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)))

# Define a pairwise comparison index matrix using 'combn'
idx <- combn(nrow(df1), 2)

# Create a results matrix
res <- matrix(NA, ncol = ncol(df2), nrow = nrow(df2))

# Loop through 'idx' for each possible comparison (without repeats)
for(i in 1:ncol(idx)){
  logiTest <- (df1$Var[idx[1,i]] + df1$Var[idx[2,i]]) < df2[idx[1,i], idx[2,i]]
  res[idx[1,i], idx[2, i]] <- logiTest
  res[idx[2,i], idx[1, i]] <- logiTest
}

# Count the number of 'true' comparisons
nTrues <- sum(res, na.rm = TRUE)/2

このコードでは、単純にペアワイズ比較インデックス (idx) を使用して、df1 と df2 のどちらの要素を「for ループ」の各反復で使用するかを定義しています。次に、この同じインデックスを使用して、'res' マトリックスのどこに論理テストの答えを書き込むかを定義します。

注: df1 と df2 の要素の順序が同じでない場合、このコードは機能しません。このような場合、実際の文字を使用して比較する値を定義するのが適切です。

于 2013-09-04T15:38:56.667 に答える