gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:53:10 25 4
gpt4 key购买 nike

我有一个足球比赛结果数据集,我希望通过创建一组类似于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com