【问题标题】:Difference between two groups, data processing两组差异,数据处理
【发布时间】:2020-05-30 12:07:53
【问题描述】:

我有一个数据处理问题,我想计算两支球队在不同比赛中的进球数差异。数据如下所示:

    matchId teamId   eventSec
1   2799331   6718  443.55984
2   2799331   6726 1152.62584
3   2799331   6718 2113.82370
4   2799331   6718 2066.28793
5   2799332   6710 1001.35775
6   2799332   6721 2469.32876
7   2799333   6734  744.35563

所以其中一条线代表球队进球,matchId 代表比赛,teamId 代表比赛中的球队,eventSec 代表进球的时间。我想要完成的是每行显示得分差异的变量,因此此示例数据中的第一行应该有一个目标差异 1,第二行应该有目标差异 0,第三行目标差异应该是 1等。

我想将此应用到具有许多不同匹配和团队 ID 的大型数据集,因此我需要一个非常通用的解决方案来解决这个问题。我尝试了不同的 dplyr 解决方案,但被卡住了一百万次,真的很需要帮助。

非常感谢!

【问题讨论】:

    标签: r dataframe dplyr data-processing


    【解决方案1】:

    希望我正确地遵循了您的逻辑,请告诉我。

    library(tidyverse)
    
    df %>%
      group_by(matchId) %>%
      mutate(point = if_else(teamId == first(teamId), 1, -1),
             goal_diff = cumsum(point))
    

    另外,如果你想得到每场比赛的得分,你可以添加:

    group_by(matchId, teamId) %>%
    summarise(score = sum(abs(point)))
    

    输出

    # A tibble: 7 x 5
    # Groups:   matchId [3]
      matchId teamId eventSec point goal_diff
        <int>  <int>    <dbl> <dbl>     <dbl>
    1 2799331   6718     444.     1         1
    2 2799331   6726    1153.    -1         0
    3 2799331   6718    2114.     1         1
    4 2799331   6718    2066.     1         2
    5 2799332   6710    1001.     1         1
    6 2799332   6721    2469.    -1         0
    7 2799333   6734     744.     1         1
    

    【讨论】:

      【解决方案2】:

      好吧,如果你的数据集不像百万行,那么试试这个:

      x=structure(list(matchId = c(2799331L, 2799331L, 2799331L, 2799331L, 
      2799332L, 2799332L, 2799333L), teamId = c(6718L, 6726L, 6718L, 
      6718L, 6710L, 6721L, 6734L), eventSec = c(443.55984, 1152.62584, 
      2113.8237, 2066.28793, 1001.35775, 2469.32876, 744.35563)), class = "data.frame", row.names = c("1", 
      "2", "3", "4", "5", "6", "7"))
      
      library(dplyr)
      x %>% group_by(matchId) %>% mutate(goalD=cumsum(ifelse(teamId==teamId[1],1,-1)))
      
      # A tibble: 7 x 4
      # Groups:   matchId [3]
        matchId teamId eventSec goalD
          <int>  <int>    <dbl> <dbl>
      1 2799331   6718     444.     1
      2 2799331   6726    1153.     0
      3 2799331   6718    2114.     1
      4 2799331   6718    2066.     2
      5 2799332   6710    1001.     1
      6 2799332   6721    2469.     0
      7 2799333   6734     744.     1
      

      【讨论】:

        【解决方案3】:

        我们也可以通过索引来做到这一点

        library(dplyr)
        df1 %>% 
          group_by(matchId) %>%
          mutate(goal_diff =cumsum(c(-1, 1)[(teamId == first(teamId)) + 1 ]))
        # A tibble: 7 x 4
        # Groups:   matchId [3]
        #  matchId teamId eventSec goal_diff
        #    <int>  <int>    <dbl>     <dbl>
        #1 2799331   6718     444.         1
        #2 2799331   6726    1153.         0
        #3 2799331   6718    2114.         1
        #4 2799331   6718    2066.         2
        #5 2799332   6710    1001.         1
        #6 2799332   6721    2469.         0
        #7 2799333   6734     744.         1
        

        数据

        df1 <- structure(list(matchId = c(2799331L, 2799331L, 2799331L, 2799331L, 
        2799332L, 2799332L, 2799333L), teamId = c(6718L, 6726L, 6718L, 
        6718L, 6710L, 6721L, 6734L), eventSec = c(443.55984, 1152.62584, 
        2113.8237, 2066.28793, 1001.35775, 2469.32876, 744.35563)),
        class = "data.frame", row.names = c("1", 
        "2", "3", "4", "5", "6", "7"))
        

        【讨论】:

          猜你喜欢
          • 2014-11-20
          • 1970-01-01
          • 1970-01-01
          • 2018-09-28
          • 1970-01-01
          • 1970-01-01
          • 2018-10-03
          • 2020-03-18
          • 2023-03-12
          相关资源
          最近更新 更多