R:按顺序计算变量的位移

时间:2016-07-15 14:25:13

标签: r

我们正在开发一个在线测试,其中我们呈现6个图像(连续),要求参与者从最小到最大重新洗牌(实际目标更具挑战性,但除此之外)。测试开始于以随机顺序呈现图像。最后,我想计算参与者的响应与正确响应的总位移(或偏差)。

举例说明:

我们首先提出六个图像:

[img1] [img2] [img3] [img4] [img5] [img6]

参与者可能会将图像重新洗牌为:

[img2] [img4] [img3] [img1] [img6] [img5]

此试用的正确顺序实际上可能是:

[img1] [img4] [img3] [img2] [img5] [img6]

因此,我们发现参与者没有将所有图像放在正确的位置:img1向左移位3个位置,而img2向右移3个位置;并且img5img6每个都取代了1个位置。因此,总排量为3 + 3 + 1 + 1 = 8

R中有优雅的方法来计算这个位移吗?

2 个答案:

答案 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