繁体   English   中英

Function 对之前的 N 个观测值求和

Function that sums previous N observations

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我想找到一种有效的方法来计算一个球队在前 N 场比赛中获得的分数(不包括当前比赛中的分数),每个模拟 ID、球队和赛季的组合。 如果一支球队到目前为止参加的比赛少于 N 场,则 function 应该返回 NA。

一个简化的数据集:

匹配ID 季节 模拟_ID 主队 团队 匹配结果 team_points
1 2015-2016 1 真的 曼联 主场获胜 3
1 2015-2016 2 真的 曼联 1
1 2015-2016 3 真的 曼联 主场获胜 3
1 2015-2016 1 错误的 托特纳姆热刺 主场获胜 0
1 2015-2016 2 错误的 托特纳姆热刺 主场获胜 0
1 2015-2016 3 错误的 托特纳姆热刺 客场胜利 3
2 2015-2016 1 真的 莱斯特 主场获胜 3
2 2015-2016 2 真的 莱斯特 主场获胜 3
2 2015-2016 3 真的 莱斯特 客场胜利 0
2 2015-2016 1 错误的 桑德兰 1

预期的 output 是数据中的一个额外列,称为“accumulated_team_points”,它返回该球队、赛季和模拟 ID 在最后 N 场比赛中的得分。

我似乎无法找到一种方法来做到这一点。

1 个回复

您在这里需要两个操作:分组(我将使用dplyr进行演示)和滚动窗口求和(我将使用zoo )。

此外,您的数据有点太稀疏,无法将所有三个team, season, simulation_ID ID 分组,所以这次我将只显示按team分组。 对于更大的数据,将group_by(team)替换为group_by(team, season, simulation_ID)

library(dplyr)
k <- 3 # window size
dat %>%
  group_by(team) %>%
  mutate(accumulated_team_points = zoo::rollapply(team_points, k, FUN = sum, align = "right", fill = NA)) %>%
  ungroup()
# # A tibble: 10 x 8
#    match_ID season    simulation_ID home_team team           match_result team_points accumulated_team_points
#       <int> <chr>             <int> <lgl>     <chr>          <chr>              <int>                   <int>
#  1        1 2015-2016             1 TRUE      Manchester Utd Home win               3                      NA
#  2        1 2015-2016             2 TRUE      Manchester Utd Draw                   1                      NA
#  3        1 2015-2016             3 TRUE      Manchester Utd Home win               3                       7
#  4        1 2015-2016             1 FALSE     Tottenham      Home win               0                      NA
#  5        1 2015-2016             2 FALSE     Tottenham      Home win               0                      NA
#  6        1 2015-2016             3 FALSE     Tottenham      Away win               3                       3
#  7        2 2015-2016             1 TRUE      Leicester      Home win               3                      NA
#  8        2 2015-2016             2 TRUE      Leicester      Home win               3                      NA
#  9        2 2015-2016             3 TRUE      Leicester      Away win               0                       6
# 10        2 2015-2016             1 FALSE     Sunderland     Draw                   1                      NA     

对于 window 中的前k-1实例,默认值为NA ,这通常是一个合理且可辩护的默认值。 但是,如果您想对部分和进行求和,则将fill=NA替换为partial=TRUE

dat %>%
  group_by(team) %>%
  mutate(accumulated_team_points = zoo::rollapply(team_points, k, FUN = sum, align = "right", partial = TRUE)) %>%
  ungroup()
# # A tibble: 10 x 8
#    match_ID season    simulation_ID home_team team           match_result team_points accumulated_team_points
#       <int> <chr>             <int> <lgl>     <chr>          <chr>              <int>                   <int>
#  1        1 2015-2016             1 TRUE      Manchester Utd Home win               3                       3
#  2        1 2015-2016             2 TRUE      Manchester Utd Draw                   1                       4
#  3        1 2015-2016             3 TRUE      Manchester Utd Home win               3                       7
#  4        1 2015-2016             1 FALSE     Tottenham      Home win               0                       0
#  5        1 2015-2016             2 FALSE     Tottenham      Home win               0                       0
#  6        1 2015-2016             3 FALSE     Tottenham      Away win               3                       3
#  7        2 2015-2016             1 TRUE      Leicester      Home win               3                       3
#  8        2 2015-2016             2 TRUE      Leicester      Home win               3                       6
#  9        2 2015-2016             3 TRUE      Leicester      Away win               0                       6
# 10        2 2015-2016             1 FALSE     Sunderland     Draw                   1                       1

仅供参考:我假设数据是预先订购的。


数据

dat <- structure(list(match_ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), season = c("2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016"), simulation_ID = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L), home_team = c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE), team = c("Manchester Utd", "Manchester Utd", "Manchester Utd", "Tottenham", "Tottenham", "Tottenham", "Leicester", "Leicester", "Leicester", "Sunderland"), match_result = c("Home win", "Draw", "Home win", "Home win", "Home win", "Away win", "Home win", "Home win", "Away win", "Draw"), team_points = c(3L, 1L, 3L, 0L, 0L, 3L, 3L, 3L, 0L, 1L)), class = "data.frame", row.names = c(NA, -10L))
1 求和前n个倒数的递归函数

下面的函数接受整数n并返回前n个倒数的和。 sum(2)应该返回1.5 这是我所拥有的: 我几乎可以肯定这应该可行,但是基本上所有东西都返回1.0。 ...

2 如何用OR条件求和前N个值的总和?

我一直在使用以下公式将某些条件下给定列的前3个值相加。 color和values称为范围。 =SUMPRODUCT(LARGE((color="red")*(values),{1,2,3})) 我找不到答案的是当我想对颜色是red或green时的值求和。 这可能吗? ...

2019-05-01 23:55:22 1 25   excel
4 随机访问n个观测值

假设我有一组50个变量和50个观察值。 是否可以访问100个随机“单元”并更改其值? 如果我不必为此使用SQL,那就太好了。 ...

2016-03-20 17:03:07 3 73   sas
5 Python pandas:对分组值 x 的前 n 行求和

给定示例数据 我想对按“id”列分组的前 n 行求和,按价格排序,其中 n 是该 id 总和数量的 15%。 我目前正在使用 iterrows 循环来获得想要的结果,但它非常慢。 如下所示,它不是很漂亮。 我怎样才能让这个 function 更有效率? 我一直试图让它与 groupby 一起工作,但 ...

6 对Haskell的前n个奇数求和

我是Haskell的新手,而且还是功能编程的新手,我想知道您将如何在Haskell中编写这样的函数。 我已经习惯了命令式语言,但是现在在haskell中处理递归对我来说是遥不可及的。 注意,我知道奇数之和可以用n ^ 2来完成(即3个第一个奇数1 + 3 + 5 = 9 = 3 ^ 2的总和 ...

7 替换稀疏矩阵的前几个观测值

我有以下数据,如下所示: 我把它放到稀疏格式,看起来像: 当我创建这个稀疏矩阵时,我得到一个警告: 这基本上用NA值替换group n 。 我试图使用dat_sparse@x &lt;- names将前n行重命名为names字符向量的长度。 然而,它并没有真正做我想要 ...

8 通过预设的 N 个观测值对变量求和

我在做一个相当基本的总结时遇到了问题。 我的数据集由公司 ID (cusip8) 及其每日(日期)异常收益 (AR) 组成。 我需要总结每家公司的异常收益,从 t+3 天到 t+60 天。 我尝试了以下方法: 并且还没有在新生成的变量中留下just.'s。 有谁知道如何解决这个问题? 我正在使用 S ...

9 求和到值 n

我设法编写了一个求和代码,该求和代码假定为整数 20,它的正确值为 210。但是,每次程序运行时,我都希望获取每个整数的值。 因此,对于整数 1,它应该说“1 = 1 的总和”,然后程序将再次运行,在前一行下方添加一行新文本,说“2 = 3 的总和”等。现在我只能得到它说的是“20的总和=210” ...

10 如何对数组中的前 n 个条目求和?

我是编程和学习 javascript 递归的新手。 这是我学习 JavaScript 和学习在线课程的第 5 天。 问题是我需要对数组中的前 n 个条目(在本例中为前 3 个数字)求和。 但我最终得到了所有的总和,而且我也不确定。 我究竟做错了什么? 我检查过大多数人正在使用 reduce 方法 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM