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から始まる必要はありません(ただし、指定された1つのパターンのみをチェックする関数で問題ありません)その上)。どんな助けでも大歓迎です!

4

2 に答える 2

4

これは、私のコメントに基づいた完全な回答であり、「1つずつずれている」すべてのシーケンスをキャッチします。

#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 に答える