我们正在开发一个在线测试,其中我们呈现6个图像(连续),要求参与者从最小到最大重新洗牌(实际目标更具挑战性,但除此之外)。测试开始于以随机顺序呈现图像。最后,我想计算参与者的响应与正确响应的总位移(或偏差)。
举例说明:
我们首先提出六个图像:
[img1] [img2] [img3] [img4] [img5] [img6]
参与者可能会将图像重新洗牌为:
[img2] [img4] [img3] [img1] [img6] [img5]
此试用的正确顺序实际上可能是:
[img1] [img4] [img3] [img2] [img5] [img6]
因此,我们发现参与者没有将所有图像放在正确的位置:img1
向左移位3个位置,而img2
向右移3个位置;并且img5
和img6
每个都取代了1个位置。因此,总排量为3 + 3 + 1 + 1 = 8
R中有优雅的方法来计算这个位移吗?
答案 0 :(得分:3)
你可以试试这个
sum(abs(match(x,y)-match(x,x)))
数据强>
x=c(2,4,3,1,6,5)
y=c(1,4,3,2,5,6)
答案 1 :(得分:0)
我正在分解这么多,显然你可以在两行压缩它。如果你愿意的话。
这是正确的输出:
> correct_output <- data.frame(img=c(1, 4, 3, 2, 5, 6), rank=1:6)
img rank
1 1 1
2 4 2
3 3 3
4 2 4
5 5 5
6 6 6
这是用户输出:
> user_output <- data.frame(img=c(2, 4, 3, 1, 6, 5), user_rank=1:6)
img user_rank
1 2 1
2 4 2
3 3 3
4 1 4
5 6 5
6 5 6
让我们把它们绑在一起:
> merge(correct_output, user_output, by="img")
img rank user_rank
1 1 1 4
2 2 4 1
3 3 3 3
4 4 2 2
5 5 5 6
6 6 6 5
从这里开始很容易。我正在使用dplyr
包。
> tmp <- mutate(tmp, penalty=abs(rank-user_rank))
img rank user_rank penalty
1 1 1 4 3
2 2 4 1 3
3 3 3 3 0
4 4 2 2 0
5 5 5 6 1
6 6 6 5 1
> sum(tmp$penalty)
[1] 8