2016-07-15 13 views
1

Wir entwickeln einen Online-Test, in dem wir 6 Bilder (in einer Reihe) präsentieren, die Teilnehmer werden gebeten, von kleinsten zu größten zu mischen (das eigentliche Ziel ist schwieriger, aber neben dem Punkt Hier). Der Test beginnt damit, dass die Bilder in zufälliger Reihenfolge präsentiert werden. Am Ende möchte ich die Gesamtverschiebung (oder Abweichung) der Antwort des Teilnehmers von der korrekten Antwort berechnen.R: Berechnen der Verschiebung von Variablen in der Reihenfolge

Zur Veranschaulichung:

Wir mögen so durch die Vorlage sechs Bilder beginnen:

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

Ein Teilnehmer könnte dann neu mischen die Bilder an:

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

Die Richtige Reihenfolge für diesen Versuch könnte tatsächlich b e:

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

So sehen wir, dass die Teilnehmer alle Bilder in der korrekten Position nicht gesetzt haben: img1 3 Positionen nach links verschoben wird, während img2 3 Positionen nach rechts verschoben wird; und img5 und img6 sind jeweils um 1 Position versetzt. Somit ist die Gesamtverschiebung 3 + 3 + 1 + 1 = 8

Gibt es einen eleganten Weg in R, um diese Verschiebung zu berechnen?

+1

Mögliche Duplikat [footrule Abstand mit Basis R Spearman] (http://stackoverflow.com/questions/38328325/spearmans-footrule-distance-with-base-r) – 989

Antwort

3

können Sie diese versuchen

sum(abs(match(x,y)-match(x,x))) 

Daten

x=c(2,4,3,1,6,5) 
y=c(1,4,3,2,5,6) 
0

ich dies Zersetzen viel, komprimieren Sie können natürlich diese auf zwei Zeilen, wenn Sie wollen.

Dies ist die korrekte Ausgabe:

> 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 

Dies ist die Benutzerausgabe:

> 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 

uns zusammen binden Lassen Sie sie:

> 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 

Von hier aus ist es sehr einfach. Ich verwende das dplyr Paket.

> 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 
Verwandte Themen