【问题标题】:Adding Blocks to R data将块添加到 R 数据
【发布时间】:2016-09-10 21:34:28
【问题描述】:

我有以下数据

set.seed(1234)
round<-rep(1:12,2)
players<-rep(1:2, c(12,12))
decs<-sample(1:3,24,replace=TRUE)
game<-rep(rep(1:2,c(6,6)),2)
gamematrix<-cbind(players,game,round,decs)
gamematrix

        players game round decs
 [1,]       1    1     1    1
 [2,]       1    1     2    2
 [3,]       1    1     3    2
 [4,]       1    1     4    2
 [5,]       1    1     5    3
 [6,]       1    1     6    2
 [7,]       1    2     7    1
 [8,]       1    2     8    1
 [9,]       1    2     9    2
[10,]       1    2    10    2
[11,]       1    2    11    3
[12,]       1    2    12    2
...

现在,我想添加一个列:“block”,这样对于每场比赛中的每个玩家,前 3 轮将成为第 1 轮,接下来的 3 轮将成为第 2 轮。

以上数据的结果应该是:

       players game round decs block
 [1,]       1    1     1    1    1
 [2,]       1    1     2    2    1
 [3,]       1    1     3    2    1
 [4,]       1    1     4    2    2
 [5,]       1    1     5    3    2
 [6,]       1    1     6    2    2    
 ...

任何想法如何做到这一点? 谢谢!

【问题讨论】:

  • 还有什么?每个players 有六个以上。
  • Тhanks @RichardScriven!为了简单起见,我只放了部分数据。真实数据有 100 名参与者,400 轮和 4 场比赛。我希望 ** 每个游戏中的每个** 将游戏分成 5 个相等的块(每个 20 轮)。

标签: r vector split


【解决方案1】:

我们可以使用ave

cbind(gamematrix, block =ave((gamematrix[,3]-1)%%3==0, 
                      gamematrix[,1], gamematrix[,2], FUN= cumsum))
#      players game round decs block
# [1,]       1    1     1    1     1
# [2,]       1    1     2    2     1
# [3,]       1    1     3    2     1
# [4,]       1    1     4    2     2
# [5,]       1    1     5    3     2
# [6,]       1    1     6    2     2
# [7,]       1    2     7    1     1
# [8,]       1    2     8    1     1
# [9,]       1    2     9    2     1
#[10,]       1    2    10    2     2
#[11,]       1    2    11    3     2
#[12,]       1    2    12    2     2
#[13,]       2    1     1    1     1
#[14,]       2    1     2    3     1
#[15,]       2    1     3    1     1
#[16,]       2    1     4    3     2
#[17,]       2    1     5    1     2
#[18,]       2    1     6    1     2
#[19,]       2    2     7    1     1
#[20,]       2    2     8    1     1
#[21,]       2    2     9    1     1
#[22,]       2    2    10    1     2
#[23,]       2    2    11    1     2
#[24,]       2    2    12    1     2

【讨论】:

  • 谢谢@akrun!你能解释一下 ave 函数是如何在这里工作的吗?我意识到“gamematrix[,3]-1)%%3==0”返回 TRUE/FALSE,所以它基本上拆分了数据。现在是按玩家和游戏划分的吗?但是“cumsum”总结了什么?
  • 上面的答案回答了一个更普遍的问题:例如,如果你有 N 个参与者,600 轮,你仍然可以使用上面的代码来添加块。只需将“%%3”更改为您要构建的组数即可。
  • @YefR 你是对的,改变数字,你会得到组数
  • @YefR cumsum 获取每个playersgame 的逻辑索引的累积和(这些是ave 中的分组变量
  • @YefR 我猜你误会了。如果您从第 19 次观察中查看逻辑索引,即(gamematrix[,3]-1)%%3==0# [1] TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE [23] FALSE FALSE,即。 TRUE 值,它基于玩家和游戏中相同的值('2')获取累积总和,即 19 到 21 将是 1 1 1,因为 TRUE/FALSE 被强制转换为 1/0 所以累积总和将是1 1 1 直到下一个 TRUE 即 .22nd 观察,在其中加 1 以得到 2 2 2
猜你喜欢
  • 2020-10-19
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
相关资源
最近更新 更多