Разница между двумя группами, обработка данных - PullRequest
3 голосов
/ 14 февраля 2020

У меня есть проблема с обработкой данных, когда я хочу подсчитать разницу в головах между двумя командами в разных матчах. Данные выглядят так:

    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 команды в матче и eventSe c время гола. , То, чего я хочу достичь sh - это переменная для каждой строки, которая показывает разницу в баллах, поэтому первая строка в данных этого примера должна иметь разницу в 1, вторая строка должна иметь разницу в 0, третья строка - цель разница на 1 и т. д. c.

Я хочу применить это к большому набору данных с большим количеством различных совпадений и идентификаторов команд, поэтому мне нужно довольно общее решение для решения этой проблемы. Я пробовал разные решения dplyr, но застрял миллион раз и очень хотел бы помочь.

Заранее большое спасибо!

Ответы [ 3 ]

4 голосов
/ 14 февраля 2020

Надеюсь, я правильно следую вашим логикам c, дайте мне знать.

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
3 голосов
/ 14 февраля 2020

Что ж, если ваш набор данных не похож на миллион строк, попробуйте следующее:

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
2 голосов
/ 14 февраля 2020

Мы также можем сделать это с индексированием

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

data

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"))
...