【问题标题】:How to calculate the # of unique player (when repeat entry is allowed)?如何计算唯一玩家的数量(允许重复输入时)?
【发布时间】:2013-02-21 05:27:50
【问题描述】:

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

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 组),第二列是每个玩家加入实验的归一化时间(我已将这一列从最小排序to最大),第三个是每个玩家的名字(每个玩家只加入一个单独的组)。

我想要生成的是最后一列,称为# of unique player,例如对于第 1 组,记录了 5 名玩家 (A B A A D),但那里只有 3 名唯一玩家 (A B D),玩家 A 开始游戏(第一行)并在玩家 B 玩完(第二行)后重新加入(第三行),然后玩家A再次加入游戏(第4行由此被记录),最终玩家D进入并完成了整个游戏。

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

【问题讨论】:

  • 那么,您是否要重新创建现有的最后一列?或者您是否试图让第 1 组和第 2 组各有 3 个独特的球员,而第 3 组有 4 个独特的球员?

标签: r


【解决方案1】:

我认为这会给你你想要的(我认为你的第 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

【讨论】:

    【解决方案2】:

    稍微更紧凑,使用 data.table

    DT <- data.table(x)
    
    
    DT[, uniqueNum := cummax(match(Name,unique(Name))), by = group]
    

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

    DT[, totalUnique := max(uniqueNum), by = group] 
    

    【讨论】:

    • aweeeeeesome 以及,两者都是完美的答案!
    • @Stat - 在这种情况下记得标记一个作为答案。 mnel 不需要积分,提示提示。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2019-01-14
    • 2021-07-28
    • 2011-05-23
    相关资源
    最近更新 更多