【问题标题】:Create data frame for each unique row in another data frame为另一个数据框中的每个唯一行创建数据框
【发布时间】:2015-09-29 00:23:19
【问题描述】:

对于我的研究生课程作业,我被要求从英超联赛结果数据集中提取数据(位于 here)。我非常接近完成,但需要最后两个输出的帮助。

我们必须创建一个可以接收两个参数的函数,一个日期和一个季节。该函数必须返回一个数据框,其中包含该日期相应季节的表格。它必须包括胜负、主场战绩、客场战绩等。我唯一没有弄清楚的是 W/L 连胜和最近 10 场比赛的结果。

以下是初始数据集的示例:

   e.Date           e.HomeTeam    e.AwayTeam   e.FTHG e.FTAG  e.FTR
   1  2015-08-08    Bournemouth    Aston Villa      0      1     A
   2  2015-08-08        Chelsea        Swansea      2      2     D
   3  2015-08-08        Everton        Watford      2      2     D
   4  2015-08-08      Leicester     Sunderland      4      2     H
   5  2015-08-08     Man United      Tottenham      1      0     H

我的计划是整理出每个俱乐部的主场和客场数据,然后将它们合并在一起,然后再进行分析以找出连续和最近 10 个结果。

我将数据处理成如下所示:

          HomeTeam FTR       Date freq
 1         Arsenal   L 2015-08-09    1
 2         Arsenal   D 2015-08-24    1
 3         Arsenal   W 2015-09-12    1
 4     Aston Villa   L 2015-08-14    1
 5     Aston Villa   L 2015-09-19    1
 6     Aston Villa   D 2015-08-29    1

现在我有点迷路了。我的想法是运行某种循环(for?ddply?data.table?)为每个俱乐部创建一个数据框,其中包含他们的结果,然后再次循环进行任何计算以获得所需的变量(连续和最后 10 ) 并以某种方式将它们推回到我存放所有其他输出的主数据框中。

我不想直接被告知答案,因为我自己学习这一点很重要。但是,如果有人能指出我正确的方向,那就太好了。非常感谢。

【问题讨论】:

    标签: r dataframe unique epl


    【解决方案1】:

    我创建了一些虚拟数据只是为了演示一些命令并可能给你一些想法。

    set.seed(321)
    dat <- data.frame(team = sample(letters[1:3], 20, replace=TRUE), 
                      season = rep("season1", 20), 
                      time = rnorm(20), 
                      win_loss = sample(c("win", "loss"), 20, replace=TRUE))
    

    问题 1. 找到连续赢/输

    看看下面的rle函数示例

    # 1. find wl streak of team 'a'
    tmp <- dat[dat$team == "a", ]
    tmp <- tmp[order(tmp$time), ]
    > tmp
       team  season        time win_loss
    19    a season1 -1.12032742     loss
    14    a season1 -1.07223880     loss
    16    a season1  0.09500072     loss
    3     a season1  0.18832552     loss
    8     a season1  0.42033257     loss
    4     a season1  2.44325982      win
    
    # shows runs of 5 consecutive losses, then 1 consecutive win
    rle(tmp$win_loss == "win")
    Run Length Encoding
      lengths: int [1:2] 5 1
      values : logi [1:2] FALSE TRUE
    

    这是rleHow can I count runs in a sequence? 上的一个非常有用的帖子

    问题 2. 最近 3 个结果

    我颠倒了time 的顺序,然后选择了前 3 个结果。

    # 2. find last 3 matches for team 'b'
    tmp <- dat[dat$team == "b", ]
    tmp <- tmp[rev(order(tmp$time)), ]
    > tmp[1:3, ]
       team  season      time win_loss
    11    b season1 0.9172555     loss
    9     b season1 0.5775845      win
    7     b season1 0.4560691     loss
    

    【讨论】:

    • 已经有一段时间了,但非常感谢您的帮助,尤其是按顺序运行。
    • 不客气 - 感谢您的评论。很高兴这对您有所帮助。
    猜你喜欢
    • 2021-06-15
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多