1

R で一連の行と固定ベクトルを比較し、同一 (TRUE) または同一でない (FALSE) としてフラグを立てようとしています。一連のテスト応答を回答キーと比較する問題を想像してみてください。

ループと COMPARE パッケージを使用して比較を実行できましたが、BY、APPLY、DDPLY などのより効率的な方法を使用して比較を複製することはできませんでした。

test.answers <- as.data.frame(rbind(c(ID="A",rep(3, 6)), c(ID="B",6:1), c(ID="C",1:6)))

library(compare)

# Compare using a loop
for (i in 1:length(test.answers)) 
  {
  test.answers$Static1[i] <- isTRUE(compare(as.data.frame(rbind(rep(3, 6))),
                                            test.answers[i,2:7], allowAll=TRUE))
  }
test.answers # This is correct!

staticfn <- function(x) 
  { 
  isTRUE(compare(as.data.frame(rbind(rep(3, 6))),
                 test.answers[2:7], allowAll=TRUE)) 
  }

# Compare using APPLY
test.answers$Static2 <- apply(test.answers, 1, staticfn)
test.answers # This is incorrect!

# Compare using BY
test.answers$Static3 <- by(test.answers, test.answers$ID, staticfn)
test.answers # This is incorrect!

# Compare using DDPLY
library(plyr)
test.answers <- ddply(test.answers, .(ID), { staticfn })
test.answers # This is incorrect!


# Results

  ID V2 V3 V4 V5 V6 V7 Static1 Static2 Static3
1  A  3  3  3  3  3  3    TRUE    TRUE    TRUE
2  B  6  5  4  3  2  1   FALSE    TRUE    TRUE
3  C  1  2  3  4  5  6   FALSE    TRUE    TRUE

  ID   V1
1  A TRUE
2  B TRUE
3  C TRUE

APPLY と DDPLY がループとは異なる結果をもたらす理由と、これらの関数の 1 つを変更してループを使用しないようにする方法を誰かが提案できれば幸いです。

4

1 に答える 1