r - 在 R 中创建一个运行计数变量?

标签 r time-series cumulative-sum

我有一个足球比赛结果数据集,我希望通过创建一组类似于 World Football Elo 公式的运行评分来学习 R。我遇到了在 Excel 中看似简单的事情在 R 中并不完全直观的问题。例如,4270 个观察中的前 15 个具有必要的变量:

       date t.1  t.2 m.result
1  19960406  DC   SJ      0.0
2  19960413 COL   KC      0.0
3  19960413  NE   TB      0.0
4  19960413 CLB   DC      1.0
5  19960413 LAG NYRB      1.0
6  19960414 FCD   SJ      0.5
7  19960418 FCD   KC      1.0
8  19960420  NE NYRB      1.0
9  19960420  DC  LAG      0.0
10 19960420 CLB   TB      0.0
11 19960421 COL  FCD      1.0
12 19960421  SJ   KC      0.5
13 19960427 CLB NYRB      1.0
14 19960427  DC   NE      0.5
15 19960428 FCD   TB      1.0

我希望能够创建一个新变量,该变量将是 t.1 和 t.2 的总比赛的运行​​计数(即,截至有问题的日期,“DC”出现在 t.1 或 t 列中的实例.2):
           date t.1  t.2 m.result  ##t.1m    ##t.2m
    1  19960406  DC   SJ      0.0       1         1
    2  19960413 COL   KC      0.0       1         1
    3  19960413  NE   TB      0.0       1         1
    4  19960413 CLB   DC      1.0       1         2
    5  19960413 LAG NYRB      1.0       1         1
    6  19960414 FCD   SJ      0.5       1         2
    7  19960418 FCD   KC      1.0       2         2
    8  19960420  NE NYRB      1.0       2         2
    9  19960420  DC  LAG      0.0       3         2
    10 19960420 CLB   TB      0.0       2         2
    11 19960421 COL  FCD      1.0       2         3
    12 19960421  SJ   KC      0.5       3         3
    13 19960427 CLB NYRB      1.0       3         3
    14 19960427  DC   NE      0.5       4         3
    15 19960428 FCD   TB      1.0       4         3

在 Excel 中,这是一个(相对)简单的 =SUMPRODUCT 方程,例如:
E4=SUMPRODUCT((A:A<=A4)*(B:B=B4))+SUMPRODUCT((A:A<=A4)*(C:C=B4))

对于 obs # 4,E4 是 t.1m,A:A 是日期,B:B 是 t.1,C:C 是 t.2,等等。

但是在 R 中,我可以为我打印总 sumproduct(即“DC”在我的数据集中玩了 576 场比赛),但出于某种原因(可能我是新手,不耐烦,反复试验)我只是迷失在如何对观察数据进行运行计数,尤其是如何将运行计数变成一个变量,这对任何游戏评级指数都至关重要。我知道“PlayerRatings”存在,我觉得对于我的 R 教育,我应该能够在没有那个包的 R 套件中做到这一点。 plyr 或 dplyr 当然可以。

作为引用,这是我的数据供您复制/粘贴到 R 中。
date<-c(19960406,19960413,19960413,19960413,19960413,19960414,19960418,19960420,19960420,19960420,19960421,19960421,19960427,19960427,19960428)
t.1<-c("DC","COL","NE","CLB","LAG","FCD","FCD","NE","DC","CLB","COL","SJ","CLB","DC","FCD")
t.2<-c("SJ","KC","TB","DC","NYRB","SJ","KC","NYRB","LAG","TB","FCD","KC","NYRB","NE","TB")
m.result<-c(0.0,0.0,0.0,1.0,1.0,0.5,1.0,1.0,0.0,0.0,1.0,0.5,1.0,0.5,1.0)
mtable<-data.frame(date,t.1,t.2,m.result)
mtable

最佳答案

这是一个非常简单的解决方案,虽然不漂亮但可以完成工作。

首先,只需更改您的数据即可更轻松地进行比较:

mtable<-data.frame(date,t.1,t.2,m.result, stringsAsFactors = FALSE)

编辑于:

如果你想确保匹配按日期排序,你可以使用 order正如@eipi10 所指出的:
mtable = mtable[order(mtable$date), ]

请注意,如果日期的格式为时间顺序不是整数顺序,您可以先使用 as.Date() 将它们转换为日期格式。 .

我们要做的是,对于每一行,使用列 t.1 的数据帧的子集。和 t.2 , 包含从 1 到所述行的所有行。所以 1:1、1:2、1:3 等等。在每次运行时,我们计算该团队出现的次数,并将其用作新列的结果。
mtable$t.1m <- sapply(1:nrow(mtable),
             function(i) sum(mtable[1:i, c("t.1", "t.2")] == mtable$t.1[i]))

这是为 t.1 中的团队完成的, 在 == 之后的参数上有一个小的变化我们可以为 t.2 :
mtable$t.2m <- sapply(1:nrow(mtable),
             function(i) sum(mtable[1:i, c("t.1", "t.2")] == mtable$t.2[i]))

现在我们的数据框看起来像这样:
> mtable
       date t.1  t.2 m.result t.1m t.2m
1  19960406  DC   SJ      0.0    1    1
2  19960413 COL   KC      0.0    1    1
3  19960413  NE   TB      0.0    1    1
4  19960413 CLB   DC      1.0    1    2
5  19960413 LAG NYRB      1.0    1    1
6  19960414 FCD   SJ      0.5    1    2
7  19960418 FCD   KC      1.0    2    2
8  19960420  NE NYRB      1.0    2    2
9  19960420  DC  LAG      0.0    3    2
10 19960420 CLB   TB      0.0    2    2
11 19960421 COL  FCD      1.0    2    3
12 19960421  SJ   KC      0.5    3    3
13 19960427 CLB NYRB      1.0    3    3
14 19960427  DC   NE      0.5    4    3
15 19960428 FCD   TB      1.0    4    3

关于r - 在 R 中创建一个运行计数变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30159041/

相关文章:

c - c 中的滚动总计循环

列表中的 Python 运行总和

mysql - SQL - 有没有办法计算一系列日期的总计?

r - 从 R 中的 coeftest 对象创建 latex 表

r - ggplotly 没有适用于 'plotly_build' 的方法应用于类 "NULL"if 语句的对象

r - 为什么以及如何作为普通用户有效地测试 R 的 beta 分布?

R 函数确定时间序列中的行是否与之前的行不同并从列表中提取这两行

python - 如何为时间序列数据创建线性回归模型?

r - 在 qplot 中使用带有数据框符号的列名

r - 计算满足日期条件后的行数