计算group_by中行之间的差异分数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算group_by中行之间的差异分数相关的知识,希望对你有一定的参考价值。

我正在处理一些比赛数据,并希望计算出每场比赛每支球队之间的目标差异。

我可以得到第二支球队的得分差异(在差异栏中),但我无法弄清楚如何计算第一支球队的球门差异。它应该是第二个团队的目标差异的倒数(即在样本数据集中,“Growlers”应该在diff列中具有1并且“Strike”应该具有-1)。

library(dplyr)

dat <-
  structure(
    list(
      Match = c(1, 1, 2, 2, 3, 3),
      Team = c("Growlers",
               "Rollers", "Strike", "Bandits", "Cats", "Blues"),
      Goals = c(1,0, 0, 1, 1, 2)
    ),
    row.names = c(NA,-6L),
    groups = structure(
      list(
        Match = c(895825, 895826, 895827),
        .rows = list(1:2, 3:4,
                     5:6)
      ),
      row.names = c(NA,-3L),
      class = c("tbl_df", "tbl",
                "data.frame"),
      .drop = TRUE
    ),
    class = c("grouped_df", "tbl_df",
              "tbl", "data.frame")
  )

dat %>% 
    group_by(Match) %>% 
    mutate(diff = Goals - lag(Goals))
#> # A tibble: 6 x 4
#> # Groups:   Match [3]
#>   Match Team     Goals  diff
#>   <dbl> <chr>    <dbl> <dbl>
#> 1     1 Growlers     1    NA
#> 2     1 Rollers      0    -1
#> 3     2 Strike       0    NA
#> 4     2 Bandits      1     1
#> 5     3 Cats         1    NA
#> 6     3 Blues        2     1

reprex package创建于2019-02-26(v0.2.0)。

答案

快速而肮脏的方法是明确计算团队1和团队2的得分,如下所示:

dat %>% 
  group_by(Match) %>% 
  mutate(
    diff = c(
      Goals[1] - Goals[2],
      Goals[2] - Goals[1] 
    )
  )

#> # A tibble: 6 x 4
#> # Groups:   Match [3]
#>   Match Team     Goals  diff
#>   <dbl> <chr>    <dbl> <dbl>
#> 1     1 Growlers     1     1
#> 2     1 Rollers      0    -1
#> 3     2 Strike       0    -1
#> 4     2 Bandits      1     1

以上是关于计算group_by中行之间的差异分数的主要内容,如果未能解决你的问题,请参考以下文章

基于关联计算表中行之间相似度的最佳方法是啥?

Joda DateTime 到 BigDecimal 分数计算

TSQL计算最旧和最新行之间的差异

使用距离矩阵计算 Pandas Dataframe 中行之间的距离

split_test_train 和交叉验证之间的分数差异很大 (10%)

为啥尽管源代码没有变化,但从一个系统到另一个系统的片段数量却有很大差异?