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 给我的结果与循环不同,以及我如何修改其中一个函数以避免使用循环,我将不胜感激。

4

1 回答 1

3

你让这太复杂了:

apply(test.answers,1,function(x){all(x[-1] == rep(3,6))})
于 2012-04-09T18:47:00.087 回答