如何计算R中的新近度

时间:2017-11-16 11:10:42

标签: r rows data-manipulation

我有以下数据:

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)

这是输出:

       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

如何计算一个新的指标变量&#34; previous_max&#34;,它返回同一参与者是否在同一游戏的下一轮选择 最大支付 >之前的轮。 所以我想要以下内容:

参与者(部分)1:

在每场比赛的第一轮中,previous_max是&#34; 0&#34; (没有前一轮),在第2轮,previous_max =&#34; 1&#34;,因为在第1轮,最大工资是最高(pay1,pay2,pay3)= max(9,5,6)= 9,在第2轮中,参与者的决定(decs)为1(这是上一轮的最大值)。

在第3轮中,previous_max = 0,因为第2轮中的最大值为8(即&#34; pay1&#34;),但参与者选择&#34; 3&#34; (这是pay3)。

1 个答案:

答案 0 :(得分:1)

以下是使用dplyrpurr::map的解决方案。 我宁愿使用group_by而不是分割但max.col忽略群组,而我不知道dplyr等价物。

输出略有不同,但我认为是因为你的错误,请解释如果没有,我会更新我的答案。

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