3

我试图在允许每个玩家重新进入游戏的实验中计算唯一玩家的数量。这是数据的样子

x <- read.table(header=T, text="group timepast Name NoOfUniquePlayer
1 0.02703 A 1
1 0.02827 B 2
1 0.02874 A 2
1 0.02875 A 2
1 0.02875 D 3
2 0.03255 M 1
2 0.03417 K 2
2 0.10029 T 3
2 0.10394 T 3
2 0.10605 K 3
2 0.16522 T 3
3 0.11938 E 1
3 0.12607 F 2
3 0.13858 E 2
3 0.16084 G 3
3 0.19830 G 3
3 0.24563 V 4")

原始实验数据包含前3列,第一列是每个实验的组数(这里是3组),第二列是每个玩家加入实验的归一化时间(我已经将这一列从小到大排序) ,第三个是每个玩家的名字(每个玩家只加入一个单组)。

我要生成的是最后一列称为唯一玩家数,例如对于第 1 组,记录了 5 名玩家(ABAAD),但那里只有 3 名唯一玩家(ABD),玩家 A 开始游戏(第一行)并重新加入(第 3 行)玩家 B 玩完(第 2 行)后,玩家 A 再次加入游戏(由此记录第 4 行),最后玩家 D 进入并完成整个游戏。

谁能帮我弄清楚如何用 R 编程来解决这个问题?

4

2 回答 2

4

我认为这会给你你想要的(我认为你的第 2 组示例中有一个错误)

x$uniquenum <- unlist(
  tapply(
     x$Name,
     x$group,
     function(y) 
       cummax(as.numeric(factor(y,levels=y[!duplicated(y)])))
    )
)

   group timepast Name NoOfUniquePlayer uniquenum
1      1  0.02703    A                1         1
2      1  0.02827    B                2         2
3      1  0.02874    A                2         2
4      1  0.02875    A                2         2
5      1  0.02875    D                3         3
6      2  0.03255    M                1         1
7      2  0.03417    K                2         2
8      2  0.10029    T                3         3
9      2  0.10394    T                3         3
10     2  0.10605    K                4         3
11     2  0.16522    T                4         3
12     3  0.11938    E                1         1
13     3  0.12607    F                2         2
14     3  0.13858    E                2         2
15     3  0.16084    G                3         3
16     3  0.19830    G                3         3
17     3  0.24563    V                4         4
于 2013-02-21T05:48:59.690 回答
3

稍微更紧凑,使用 data.table

DT <- data.table(x)


DT[, uniqueNum := cummax(match(Name,unique(Name))), by = group]

如果你想要唯一玩家的总数,那么

DT[, totalUnique := max(uniqueNum), by = group] 
于 2013-02-21T06:01:26.953 回答