2017-11-16 1 views
1

ich die folgenden Daten haben:Wie recency in R berechnen

set.seed(20) 
round<-rep(1:10,2) 
part<-rep(1:2, c(10,10)) 
game<-rep(rep(1:2,c(5,5)),2) 
pay1<-sample(1:10,20,replace=TRUE) 
pay2<-sample(1:10,20,replace=TRUE) 
pay3<-sample(1:10,20,replace=TRUE) 
decs<-sample(1:3,20,replace=TRUE) 
previous_max<-c(0,1,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,1,1,0) 
gamematrix<-cbind(part,game,round,pay1,pay2,pay3,decs,previous_max) 
gamematrix<-data.frame(gamematrix) 

Hier ist die Ausgabe:

 part game round pay1 pay2 pay3 decs previous_max 
1  1 1  1 9 5 6 2   0 
2  1 1  2 8 1 1 1   1 
3  1 1  3 3 5 5 3   0 
4  1 1  4 6 1 5 1   0 
5  1 1  5 10 3 8 3   0 
6  1 2  6 10 1 5 1   0 
7  1 2  7 1 10 7 3   0 
8  1 2  8 1 10 8 2   1 
9  1 2  9 4 1 5 1   0 
10  1 2 10 4 7 7 2   0 
11  2 1  1 8 4 1 1   0 
12  2 1  2 8 5 5 2   0 
13  2 1  3 1 9 3 1   1 
14  2 1  4 8 2 10 2   1 
15  2 1  5 2 6 2 3   1 
16  2 2  6 5 5 6 2   0 
17  2 2  7 4 5 1 2   0 
18  2 2  8 2 10 5 2   1 
19  2 2  9 3 7 3 2   1 
20  2 2 10 9 3 1 1   0 

Wie kann ich eine neue Indikatorvariable "previous_max", das anzeigt, ob kehrt berechnen in die nächste Runde des gleichen Spiels, der gleiche Teilnehmer wählen Sie die maximale Auszahlung aus der vorherigen Runde. So ich etwas will, wie folgt:

Teilnehmer (Teil) 1:

In der ersten Runde jeden Spiel, previous_max ist "0" (keine vorherige Runde), in Runde 2, previous_max = "1" , denn in Runde 1 war der maximale Lohn maximal (pay1, pay2, pay3) = max (9,5,6) = 9, und in Runde 2 waren die Entscheidungen des Teilnehmers (decs) 1 (was der Maximalwert in vorherige Runde).

In Runde 3, previous_max = 0, weil der maximale Wert in Runde 2 8 war (was "pay1" ist), aber der Teilnehmer wählt "3" (was pay3 ist).

Antwort

1

Hier ist eine Lösung mit dplyr und purr::map. Ich hätte lieber group_by als Split verwendet, aber max.col ignoriert Gruppen und ich kenne keine dplyr Äquivalent.

die Ausgabe ist etwas anders, aber ich denke, es ist wegen Ihrer Fehler, bitte erklären, wenn nicht, und ich werde meine Antwort aktualisieren.

library(purrr) 
library(dplyr) 

    gamematrix  %>% 
    split(.$part) %>% 
    map(~ .x %>% mutate(
     prev_max = as.integer( 
     decs == 
     c(0,max.col(.[c("pay1","pay2","pay3")])[-n()]) # the number of the max columns, offset by one 
    ))) %>% 
    bind_rows 

    # ` part game round pay1 pay2 pay3 decs prev_max 
    # 1  1 1  1 9 5 6 2  0 
    # 2  1 1  2 8 1 1 1  1 
    # 3  1 1  3 3 5 5 3  0 
    # 4  1 1  4 6 1 5 1  0 
    # 5  1 1  5 10 3 8 3  0 
    # 6  1 2  6 10 1 5 1  1 
    # 7  1 2  7 1 10 7 3  0 
    # 8  1 2  8 1 10 8 2  1 
    # 9  1 2  9 4 1 5 1  0 
    # 10 1 2 10 4 7 7 2  0 
    # 11 2 1  1 8 4 1 1  0 
    # 12 2 1  2 8 5 5 2  0 
    # 13 2 1  3 1 9 3 1  1 
    # 14 2 1  4 8 2 10 2  1 
    # 15 2 1  5 2 6 2 3  1 
    # 16 2 2  6 5 5 6 2  1 
    # 17 2 2  7 4 5 1 2  0 
    # 18 2 2  8 2 10 5 2  1 
    # 19 2 2  9 3 7 3 2  1 
    # 20 2 2 10 9 3 1 1  0 
+0

Danke !! Funktioniert wie eine Magie! Wenn Sie möchten, dass die Ausgabe wie in meinem Beispiel ist, sollte Ihr Code _leicht_ aktualisiert sein: split (., List (gamematrix $ part, gamematrix $ game))%>% – YefR

Verwandte Themen