【问题标题】:Manipulating R Data Frames操作 R 数据框
【发布时间】:2016-04-05 14:48:03
【问题描述】:

我目前有两个单独的数据框,摘录如下:

我的数据

Player  TG% Pts Team    Opp Yr      Rd  Grnd
John    56  42  A       1   2015    1   Grnd1
James   94  64  B       2   2015    1   Grnd2
Jerry   85  78  C       3   2015    1   Grnd3
Daniel  97  51  D       4   2015    1   Grnd4
John    89  61  A       1   2015    1   Grnd2
James   65  26  B       4   2015    1   Grnd3
Jerry   73  34  C       3   2015    1   Grnd2
Daniel  73  40  D       2   2015    1   Grnd2
John    89  26  A       1   2015    1   Grnd3
James   92  42  B       3   2015    1   Grnd1
Jerry   89  25  C       2   2015    1   Grnd2
Daniel  80  41  D       4   2015    1   Grnd2
John    73  82  A       3   2015    1   Grnd3
James   73  41  B       4   2015    1   Grnd3
Jerry   89  76  C       2   2015    1   Grnd1
Daniel  91  77  D       1   2015    1   Grnd2

圆形

Team   Opp    Grnd
A      1      Grnd1
B      3      Grnd4
C      4      Grnd2
D      2      Grnd3

我想要做的是操纵它,以便按照下面的方式生成第二个数据框

Player   Gms   Avg.Pts   Avg.Last3   Avg.v.Opp   Avg.@.Grnd
John
James
Jerry
Daniel

我知道如何在 Excel 中执行此操作,但是我在 R 中苦苦挣扎

Gms - 每个玩家的游戏总数(excel 将是 countif)

Avg.Pts - 这是每个玩家姓名的平均 Pts(excel 将是 averageif)

Avg.Last3 - 这是每个玩家在最近 3 场比赛中的平均得分,请注意,数据帧与最近的比赛在数据帧末尾是按顺序排列的。

Avg.v.Opp - 这是数据框回合中定义的每个玩家对抗下一个对手的平均得分。例如,John 为 A 队效力,他的下一个对手是 Opp 1。(excel 将是averageifs)

Avg.@.Grnd - 这是数据帧回合中定义的每个玩家在下一个场地的平均得分。例如,John 为 A 队效力,他的下一场比赛在 Grnd1 举行。 (excel将是averageifs)

我尝试过使用 dplyr 和许多其他选项,但似乎还没有成功地将现阶段可用的东西组合在一起。请注意,mydata 数据帧的行数超过 10,000 行。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我认为这会奏效。如果您与dput() 共享您的示例数据,我很乐意复制/粘贴并检查(必要时进行调试)。

    首先我会做简单的,不依赖于round的那些:

    library(dplyr)
    group_by(mydata, Player) %>%
       summarize(Gms = n(),
           Avg.Pts = mean(Pts),
           Avg.Last3 = mean(tail(Pts, 3)))
    

    我想单独做一个,以强调dplyr 在简单情况下是多么干净。 Excel 命令中的所有“ifs”都由开头的单个group_by 处理。 n() 是计数,mean() 是平均值。 tail() 是一个方便的基函数,它返回数据帧或向量的结尾。

    要添加round 数据,我们需要根据Team 列将数据框连接在一起。我们仍然希望能够区分其他列是来自mydata 还是round,所以我将重命名round 列:

    round = rename(round, next_opp = Opp, next_grnd = Grnd)
    

    然后我们将从join 开始并像以前一样继续。这次我们确实最后需要一些ifs,我将在mean调用中使用一个简单的子集:

    left_join(mydata, round) %>%
      # convert ground columns to character as discussed in comments
      mutate(next_grnd = as.character(next_grnd),
           Grnd = as.character(Grnd)) %>%
      group_by(Player) %>%
      summarize(Gms = n(),
           Avg.Pts = mean(Pts),
           Avg.Last3 = mean(tail(Pts, 3)),
           Avg.v.Opp = mean(Pts[Opp == next_opp]),
           Avg.at.Grnd = mean(Pts[Grnd == next_grnd]))
    

    【讨论】:

    • 这很好用,除了 'Avg.at.Grnd = mean(Pts[Grnd == next_grnd])',我得到一个错误 Error: level sets of factors are different 。这可能与并非所有场地每周都打球有关。
    • 是的,如果您将 Grndnext_grnd 都转换为字符而不是因子列,则可以处理它。我将在 dplyr 中编辑更改。
    • 非常好,非常感谢,非常感谢。
    • 最后一件事,如果我想添加一列显示对手的比赛数量,这里需要什么? 'count'函数能用吗?
    • 我想像sum(Opp == next_opp)
    猜你喜欢
    • 2021-06-28
    • 2021-06-28
    • 2015-09-19
    • 2021-06-26
    • 1970-01-01
    • 2015-06-26
    • 2020-11-20
    • 2020-07-22
    • 2017-01-25
    相关资源
    最近更新 更多