我有一个包含调查问卷回复的矩阵,我想做一些基本的模式检查以排除,例如,只是在他们的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开始(但是,我可以使用仅检查上面给出的一种模式)。非常感谢任何帮助!
答案 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="")))