R: сгруппировать по 2 столбцам, но только если 2-й столбец не совпадает - PullRequest
0 голосов
/ 07 июня 2018

Я новичок в R (и dplyr), и в настоящее время я работаю с некоторыми сезонными футбольными данными и нуждаюсь в некоторой помощи.В настоящее время, если игрок переходит в другой клуб в той же лиге, строка данных и все показатели просто дублируются, но с новым team_id.Однако, если игрок переходит в другую лигу, то показатели делятся.

Для согласованности мне необходимо решить эту проблему, что означает, что я должен:

Группировать по player_id, где comp_id не соответствует

(правила футболадиктовать, что вы можете играть не более 2-х клубов в сезоне, так что это сводит на нет дальнейшие осложнения, и поэтому это простое правило разрешает все)

иными словами, если есть дубликаты, суммируйте все строки, но только еслиcomp_id отличается

Я пытался сделать это в dplyr и надеялся, что будет какой-то способ написать это, например:

football_data %>%
group_by(player_id, !comp_id)

, но это не сработает и совершенно правильно, так.

Мой другой вариант - создать дополнительный столбец на основе составного ключа (player_id, comp_id) и group_by player_id только там, где счетчик составного ключа = 1, но даже тогда я пытаюсь написать это с помощью dplyr.,

Любые предложения будут приветствоваться.

Редактировать:

Существует около ста метрик, поэтому я упросту, как показано ниже:

player_id   player_name   comp,   team,  metric1, metric2, metric3 .....
1            Lacazette     Bund   Dort     20       30       20
1            Lacazette     EPL    Ars      10       15       15
2            Arnautovic    EPL    Stoke    30       40       30     
2            Arnautovic    EPL    W. Ham   30       40       30       

таким образом, в этом примере метрики данных разделяются, когда игрок перемещает лиги (Lacazette), но не, если передача находится в той же лиге (Arnautovic).

Так что для согласованности мне нужно суммировать метрики для первогоигрок, но не для второго игрока

, что приводит к выводу:

player_id   player_name   comp,   team,  metric1, metric2, metric3 .....
1            Lacazette     Bund   Dort     30       45       35
1            Lacazette     EPL    Ars      30       45       35
2            Arnautovic    EPL    Stoke    30       40       30     
2            Arnautovic    EPL    W. Ham   30       40       30     

1 Ответ

0 голосов
/ 08 июня 2018

По сути, вы хотите

  1. получить уровень игрока sum из metric переменных, сгруппированных по comp
  2. join их обратно вполный кадр данных.

library(tidyverse)
#> -- Attaching packages ----------------------------------------------------------------------------------------------------- tidyverse 1.2.1 --
#> v ggplot2 2.2.1     v purrr   0.2.4
#> v tibble  1.4.1     v dplyr   0.7.4
#> v tidyr   0.7.2     v stringr 1.2.0
#> v readr   1.1.1     v forcats 0.2.0
#> -- Conflicts -------------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
#> x dplyr::filter() masks stats::filter()
#> x dplyr::lag()    masks stats::lag()

df <- data.frame(player_id = c(1, 1, 2, 2), 
                 player_name = c("Lacazette", "Lacazette", "Arnuatovic", "Arnuatovic"), 
                 comp = c("Bund", "EPL", "EPL", "EPL"), 
                 team = c("Dort", "Ars", "Stoke", "W. Ham"), 
                 metric1 = c(20, 10, 30, 30), 
                 metric2 = c(30, 15, 40, 40), 
                 metric3 = c(20, 15, 30, 30))

df %>% 
  distinct(player_id, player_name, comp, .keep_all = T) %>% 
  group_by(player_id) %>% 
  summarize_at(vars(metric1:metric3), funs(sum)) %>% 
  left_join(df %>% select(player_id:team), ., by = "player_id")


#>   player_id player_name comp   team metric1 metric2 metric3
#> 1         1   Lacazette Bund   Dort      30      45      35
#> 2         1   Lacazette  EPL    Ars      30      45      35
#> 3         2  Arnuatovic  EPL  Stoke      30      40      30
#> 4         2  Arnuatovic  EPL W. Ham      30      40      30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...