2016-06-18 16 views
2

Ich habe ein Experiment gemacht, in dem Teilnehmer eine Aufgabe in Paaren mit einem anderen Teilnehmer gelöst haben. Jeder Teilnehmer hat dann eine Punktzahl erhalten, wie gut er die Aufgabe erledigt hat. Paare haben unterschiedliche Mengen an Versuchen durchlaufen.Wie füge ich einen Vektor hinzu, in dem ich Bewertungen von Personen innerhalb von Paaren zusammenfasse?

Ich habe einen Datenrahmen ähnlich dem unten:

participant <- c(1,1,2,2,3,3,3,4,4,4,5,6) 
pair <- c(1,1,1,1,2,2,2,2,2,2,3,3) 
trial <- c(1,2,1,2,1,2,3,1,2,3,1,1) 
score <- c(2,3,6,3,4,7,3,1,8,5,4,3) 
data <- data.frame(participant, pair, trial, score) 

participant pair trial score 
     1 1  1  2 
     1 1  2  3 
     2 1  1  6 
     2 1  2  3 
     3 2  1  4 
     3 2  2  7 
     3 2  3  3 
     4 2  1  1 
     4 2  2  8 
     4 2  3  5 
     5 3  1  4 
     6 3  1  3 

Ich möchte einen neuen Vektor zu dem Datenrahmen an, wo jeder Teilnehmer die numerische Differenz zwischen ihren eigenen Score und die bekommt anderer Teilnehmer in jeder Prüfung.

Hat jemand eine Idee, wie man das machen könnte?

Es soll so etwas wie dies am Ende aussehen:

participant pair trial score difference 
    1  1  1  2  4 
    1  1  2  3  0 
    2  1  1  6  4 
    2  1  2  3  0 
    3  2  1  4  3 
    3  2  2  7  1 
    3  2  3  3  2 
    4  2  1  1  3 
    4  2  2  8  1 
    4  2  3  5  2 
    5  3  1  4  1 
    6  3  1  3  1 

Antwort

3

Hier ist eine Lösung, die data, so dass jedes aufeinanderfolgende Paar von Reihen entspricht ein einzelnes Paar in einem einzigen Versuch erste Neuordnungs beinhaltet. Dies ermöglicht es uns, einen einzigen Anruf zu diff() zu machen, die Unterschiede zu extrahieren:

data <- data[order(data$trial,data$pair,data$participant),]; 
data$diff <- rep(diff(data$score)[c(T,F)],each=2L)*c(-1L,1L); 
data; 
## participant pair trial score diff 
## 1   1 1  1  2 -4 
## 3   2 1  1  6 4 
## 5   3 2  1  4 3 
## 8   4 2  1  1 -3 
## 11   5 3  1  4 1 
## 12   6 3  1  3 -1 
## 2   1 1  2  3 0 
## 4   2 1  2  3 0 
## 6   3 2  2  7 -1 
## 9   4 2  2  8 1 
## 7   3 2  3  3 -2 
## 10   4 2  3  5 2 

Ich nahm das Schild wollte die Richtung der Differenz zu erfassen. Wenn zum Beispiel ein Teilnehmer 4 Punkte unter den anderen Teilnehmer im selben Testpaar hat, dann nahm ich an, dass Sie -4 wollen würden. Wenn Sie alle positiven Werte wollen, können Sie die Multiplikation mit c(-1L,1L) zu entfernen und um einen Anruf zu abs() hinzufügen:

data$diff <- rep(abs(diff(data$score)[c(T,F)]),each=2L); 
data; 
## participant pair trial score diff 
## 1   1 1  1  2 4 
## 3   2 1  1  6 4 
## 5   3 2  1  4 3 
## 8   4 2  1  1 3 
## 11   5 3  1  4 1 
## 12   6 3  1  3 1 
## 2   1 1  2  3 0 
## 4   2 1  2  3 0 
## 6   3 2  2  7 1 
## 9   4 2  2  8 1 
## 7   3 2  3  3 2 
## 10   4 2  3  5 2 

Hier ist eine Lösung um ave() gebaut ist, das erfordert nicht die ganze data.frame Neuordnungs erste :

data$diff <- ave(data$score,data$trial,data$pair,FUN=function(x) abs(diff(x))); 
data; 
## participant pair trial score diff 
## 1   1 1  1  2 4 
## 2   1 1  2  3 0 
## 3   2 1  1  6 4 
## 4   2 1  2  3 0 
## 5   3 2  1  4 3 
## 6   3 2  2  7 1 
## 7   3 2  3  3 2 
## 8   4 2  1  1 3 
## 9   4 2  2  8 1 
## 10   4 2  3  5 2 
## 11   5 3  1  4 1 
## 12   6 3  1  3 1 

Hier ist, wie Sie die Punktzahl des anderen Teilnehmer derselben Studie-Paar zu bekommen:

data$other <- ave(data$score,data$trial,data$pair,FUN=rev); 
data; 
## participant pair trial score other 
## 1   1 1  1  2  6 
## 2   1 1  2  3  3 
## 3   2 1  1  6  2 
## 4   2 1  2  3  3 
## 5   3 2  1  4  1 
## 6   3 2  2  7  8 
## 7   3 2  3  3  5 
## 8   4 2  1  1  4 
## 9   4 2  2  8  7 
## 10   4 2  3  5  3 
## 11   5 3  1  4  3 
## 12   6 3  1  3  4 

Oder unter der Annahme der Daten.Rahmen wurde gemäß der Ausgangslösung neu geordnet:

data$other <- c(rbind(data$score[c(F,T)],data$score[c(T,F)])); 
data; 
## participant pair trial score other 
## 1   1 1  1  2  6 
## 3   2 1  1  6  2 
## 5   3 2  1  4  1 
## 8   4 2  1  1  4 
## 11   5 3  1  4  3 
## 12   6 3  1  3  4 
## 2   1 1  2  3  3 
## 4   2 1  2  3  3 
## 6   3 2  2  7  8 
## 9   4 2  2  8  7 
## 7   3 2  3  3  5 
## 10   4 2  3  5  3 

Alternative, mit matrix() statt rbind():

data$other <- c(matrix(data$score,2L)[2:1,]); 
data; 
## participant pair trial score other 
## 1   1 1  1  2  6 
## 3   2 1  1  6  2 
## 5   3 2  1  4  1 
## 8   4 2  1  1  4 
## 11   5 3  1  4  3 
## 12   6 3  1  3  4 
## 2   1 1  2  3  3 
## 4   2 1  2  3  3 
## 6   3 2  2  7  8 
## 9   4 2  2  8  7 
## 7   3 2  3  3  5 
## 10   4 2  3  5  3 
+1

Sie sind ein Lebensretter, danke. Angenommen, ich wollte jetzt in jedem Versuch den tatsächlichen Wert des anderen Spielers haben. Konnte das getan werden? –

+0

@MarcAndersen Sie sind herzlich willkommen! Siehe Bearbeiten für Antwort auf Folgefrage. – bgoldst

3

Hier ist eine Option data.table mit:

library(data.table) 
setDT(data)[,difference := abs(diff(score)), by = .(pair, trial)] 
data 
# participant pair trial score difference 
# 1:   1 1  1  2   4 
# 2:   1 1  2  3   0 
# 3:   2 1  1  6   4 
# 4:   2 1  2  3   0 
# 5:   3 2  1  4   3 
# 6:   3 2  2  7   1 
# 7:   3 2  3  3   2 
# 8:   4 2  1  1   3 
# 9:   4 2  2  8   1 
#10:   4 2  3  5   2 
#11:   5 3  1  4   1 
#12:   6 3  1  3   1 

Eine etwas schnellere Option wäre:

setDT(data)[, difference := abs((score - shift(score))[2]) , by = .(pair, trial)] 

Wenn wir den Wert des anderen Paares müssen:

data[, other:= rev(score) , by = .(pair, trial)] 
data 
# participant pair trial score difference other 
# 1:   1 1  1  2   4  6 
# 2:   1 1  2  3   0  3 
# 3:   2 1  1  6   4  2 
# 4:   2 1  2  3   0  3 
# 5:   3 2  1  4   3  1 
# 6:   3 2  2  7   1  8 
# 7:   3 2  3  3   2  5 
# 8:   4 2  1  1   3  4 
# 9:   4 2  2  8   1  7 
#10:   4 2  3  5   2  3 
#11:   5 3  1  4   1  3 
#12:   6 3  1  3   1  4 

Oder mit dplyr:

library(dplyr) 
data %>% 
    group_by(pair, trial) %>% 
    mutate(difference = abs(diff(score))) 
# participant pair trial score difference 
#   <dbl> <dbl> <dbl> <dbl>  <dbl> 
#1   1  1  1  2   4 
#2   1  1  2  3   0 
#3   2  1  1  6   4 
#4   2  1  2  3   0 
#5   3  2  1  4   3 
#6   3  2  2  7   1 
#7   3  2  3  3   2 
#8   4  2  1  1   3 
#9   4  2  2  8   1 
#10   4  2  3  5   2 
#11   5  3  1  4   1 
#12   6  3  1  3   1 
Verwandte Themen