3

我有一个包含问卷回复的矩阵,我想做一些基本的模式检查来排除,例如,刚刚在他们的 Scantron 表上填写了锯齿形图案的受访者。我有一个 1400×50(逐项)矩阵datonly,如下所示:

> head(datonly[,1:10])
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    2    4    4    3    4    4    4    4     4
[2,]    1    1    4   NA    5    5    4    4    4     4
[3,]    2    2    2    3    3    3    3    3    3     1
[4,]    3    1    3    2    5    2    3    4    3     4
[5,]    4    2    3    1    5    3    5    5    3     4
[6,]    4    2    4    4    5    1    5    4    4     5

正如你所看到的,里面有NAs。此外,所有问题的可能有效答案为 1 到 5。

我不知道最有效的方法,但这个矩阵并不大,所以效率不是什么大问题——我只想完成它而不是在这上面徘徊,但我想不通在每一行中检查是否找到模式 1 2 3 4 5 4 3 2 1 的工作方法。我希望函数的输出如下所示:

> which(ind==1)
[1]   24   55   66   67   74   79   83   90  127  131  147
[12]  154  162  172  221  222  248  260  263  316  339  390
[23]  402  408  436  440  456  457  460  492  497  504  526
[34]  544  550  568  583  597  602  623  628  632  639  682
[45]  684  689  705  727  747  750  751  763  764  769  784

其中ind是一个数字向量,对于不显示此模式的每一行(人),包含 0,对于每行(人),包含 1。在此示例中,我会将受访者 #24、55、66 等标记为可能不好的受访者。顺序确实很重要——否则它看起来不像 Scantron 表上的锯齿形——但模式不一定必须从 1 开始(但是,我可以使用检查给定模式的函数以上)。任何帮助深表感谢!

4

2 回答 2

4

这是基于我的评论的完整答案,它将捕获所有“关闭一个”的序列:

#random answers
set.seed(1234)
x <- matrix(sample(c(1:5, NA), 100, TRUE, prob=c(.19,.19,.19,.19,.19, .05)), ncol = 10)
#Here's the person you want to flag
x <- rbind(x, c(1:5,4:1,2))



which(
  apply(
    apply(x, 1, function(z) abs(diff(z))),2,
    function(zz) ifelse(sd(zz, na.rm = TRUE)==0,1,0)
  )== 1)
#---
[1] 11
于 2013-05-13T16:23:03.723 回答
3

据我了解,您可能想要,

as.numeric(grepl("123454321",apply(datonly,1,paste0,collapse="")))
于 2013-05-13T16:03:50.107 回答