使用R在数值矩阵中进行模式匹配

时间:2013-05-13 15:59:25

标签: r pattern-matching

我有一个包含调查问卷回复的矩阵,我想做一些基本的模式检查以排除,例如,只是在他们的Scantron表格中填写锯齿形图案的受访者。我有一个名为datonly的1400 x 50(逐个项目)矩阵,如下所示:

> 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

正如你所看到的,那里有NA个。此外,所有问题的可能有效回复都是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是一个数字向量,每行(人)不显示此模式,每行(人)为1。在这个例子中,我会将受访者#24,55,66等标记为可能是不好的受访者。顺序确实很重要 - 否则它看起来不像Scantron表上的曲折 - 但模式不一定必须从1开始(但是,我可以使用检查上面给出的一种模式)。非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

据我所知,你可能想要,

as.numeric(grepl("123454321",apply(datonly,1,paste0,collapse="")))