【问题标题】:Calculating group average, then lagging based on group计算组平均值,然后基于组滞后
【发布时间】:2017-08-31 13:08:49
【问题描述】:

我正在研究我的 R 技能。如果可能的话,我想使用 dplyr 包来解决这个问题。

我有一个梦幻足球统计数据集。每条记录都是球员在一个赛季中的一场比赛(周)的统计数据,包括该球员在该周获得的梦幻足球积分。

这是我正在处理的数据的 sn-p:

           Player  Week  year Fantasy.Points Avg.Fantasy.Ponts
 1 Aaron Hernandez     1  2011           16.3          9.678571
 2 Aaron Hernandez     2  2011           12.2          9.678571
 3 Aaron Hernandez     5  2011            5.6          9.678571
 4 Aaron Hernandez     6  2011           10.8          9.678571
 5 Aaron Hernandez     8  2011            7.1          9.678571
 6 Aaron Hernandez     9  2011            9.5          9.678571
 7 Aaron Hernandez    10  2011            4.1          9.678571
 8 Aaron Hernandez    11  2011            4.4          9.678571
 9 Aaron Hernandez    12  2011            6.2          9.678571
10 Aaron Hernandez    13  2011            4.3          9.678571
11 Aaron Hernandez    14  2011            8.4          9.678571
12 Aaron Hernandez    15  2011           20.5          9.678571
13 Aaron Hernandez    16  2011            3.7          9.678571
14 Aaron Hernandez    17  2011           22.4          9.678571
15 Aaron Hernandez     1  2012           12.4          8.755556
16 Aaron Hernandez     6  2012            9.0          8.755556
17 Aaron Hernandez     7  2012            5.4          8.755556
18 Aaron Hernandez    12  2012            3.6          8.755556
19 Aaron Hernandez    13  2012            9.7          8.755556
20 Aaron Hernandez    14  2012           17.8          8.755556

Avg.Fantasy.Points 字段是该球员在该记录中的平均得分例如,Aaron Hernandez 在 2011 赛季的平均得分为 9.678571,并且2012 赛季 8.755556 分。

我有兴趣计算一个列来表示球员在前一年的平均得分。在上面的示例中,Aaron Hernandez 在 2012 年的记录应该显示上一年的平均得分为 9.68571。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我找到了一个变通的解决方案,类似于 SQL 中的子查询。

    df_te是上面sn-p的数据框:

    df_te %>%
        left_join(
           mutate(next.year = year + 1) %>%    #add a column for the next year
           group_by(Player, year) %>%
           mutate(Previous.Avg.Fantasy.Points = first(Avg.Fantasy.Points) %>%   #Copy of 'Avg.Fantasy.Points' column, with the name I'd like to have for new column
           filter(row_number() == 1) %>%  #Only keep one row per player/year group to avoid duplication upon join
           select(Player, next.year, Previous.Avg.Fantasy.Points)   #keep only columns I'd like to join in
        by = c("Player" = "Player", "year" = "next.year")  #By joining 'year' on LHS table with 'next.year' on RHS table, can get the previous year's average points.     
    )
    

    【讨论】:

      【解决方案2】:

      由于您使用的是dplyr包,我想介绍lag函数的使用。它可以移动给定行数的值。默认为 1。最后一行select(c(colnames(dt), "Pre.Avg.Fantasy.Ponts")) 仅用于调整列的顺序。 dt2 是最终输出。

      library(dplyr)
      
      dt2 <- dt %>%
        group_by(Player, year) %>%
        summarise(Avg.Fantasy.Ponts = first(Avg.Fantasy.Ponts)) %>%
        mutate(Pre.Avg.Fantasy.Ponts = lag(Avg.Fantasy.Ponts)) %>%
        select(-Avg.Fantasy.Ponts) %>%
        right_join(dt, by = c("Player", "year")) %>%
        select(c(colnames(dt), "Pre.Avg.Fantasy.Ponts"))
      

      数据

      dt <- read.table(text = "          Player  Week  year Fantasy.Points Avg.Fantasy.Ponts
       1 'Aaron Hernandez'     1  2011           16.3          9.678571
                       2 'Aaron Hernandez'     2  2011           12.2          9.678571
                       3 'Aaron Hernandez'     5  2011            5.6          9.678571
                       4 'Aaron Hernandez'     6  2011           10.8          9.678571
                       5 'Aaron Hernandez'     8  2011            7.1          9.678571
                       6 'Aaron Hernandez'     9  2011            9.5          9.678571
                       7 'Aaron Hernandez'    10  2011            4.1          9.678571
                       8 'Aaron Hernandez'    11  2011            4.4          9.678571
                       9 'Aaron Hernandez'    12  2011            6.2          9.678571
                       10 'Aaron Hernandez'    13  2011            4.3          9.678571
                       11 'Aaron Hernandez'    14  2011            8.4          9.678571
                       12 'Aaron Hernandez'    15  2011           20.5          9.678571
                       13 'Aaron Hernandez'    16  2011            3.7          9.678571
                       14 'Aaron Hernandez'    17  2011           22.4          9.678571
                       15 'Aaron Hernandez'     1  2012           12.4          8.755556
                       16 'Aaron Hernandez'     6  2012            9.0          8.755556
                       17 'Aaron Hernandez'     7  2012            5.4          8.755556
                       18 'Aaron Hernandez'    12  2012            3.6          8.755556
                       19 'Aaron Hernandez'    13  2012            9.7          8.755556
                       20 'Aaron Hernandez'    14  2012           17.8          8.755556",
                       header = TRUE, stringsAsFactors = FALSE)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-05
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多