查找由另一个变量分组的所有组合

Finding All Combinations of a Variable Grouped by Another

我正在处理如下所示的数据:

# A tibble: 192,988 x 3
   GameID EventID Route               
    <int>   <int> <chr>               
 1   2793      10 NULL                
 2   2793      10 NULL                
 3   2793      10 NULL                
 4   2793      10 NULL                
 5   2793      10 NULL                
 6   2793      10 NULL                
 7   2793      15 Fade - Back Shoulder
 8   2793      15 Curl                
 9   2793      15 Go/Fly              
10   2793      15 Out                 
# … with 192,978 more rows

GameID 与特定的 NFL 比赛相关,EventID 是该 NFL 比赛中的单场比赛。 Route 变量是每个 WR 运行 在特定 EventID.

上的路由

例如:EventID 10 很可能是 运行 游戏,因为没有绘制 WR 路线。

然而,在 EventID 15 场比赛中,场上有四名外接手。而且,如所列,他们 运行 一个 'Fade - Back Shoulder'、一个 'Curl'、一个 'Go/Fly' 和一个 'Out.'

我需要什么帮助: 我想弄清楚如何找到路线的所有独特组合 运行。因此,上面示例数据中列出的四个将是唯一组合,依此类推。

到目前为止,我还没有靠自己的力量解决这个问题,所以我希望能在这里找到关于如何继续这个问题的答案。

编辑

我希望最终结果是这样的:

Combo.Number     Routes
1                Fade - Back Shoulder, Curl, Go/Fly, Out
2                Slant, Slant, Fade
3                Out, Out, Fade

...然后继续处理数据中剩余的 192,978 行。

假设我正确理解了您的情况,这可能是一个解决方案:

# Some data
data <- dplyr::tibble(
    "GameID" = rep(1:5, each = 10), 
    "EventID" = rep(1:10, each = 5),
    "Route" = c(NA, NA, NA, NA, NA, 
                "A", "B", "C", "D", "E",
                NA, NA, NA, NA, NA, 
                NA, NA, NA, NA, NA, 
                "A", "B", "T", "G", "E",
                "B", "A", "T", "G", "E",
                "K", "O", "T", "G", "E",
                NA, NA, NA, NA, NA, 
                NA, NA, NA, NA, NA, 
                "A", "B", "C", "D", "E"))

首先通过按两个 ID 列对数据框进行分组并分配唯一的 group_by ID 来创建一个唯一的事件 ID(因此总体上是唯一的,而不是每个游戏):

data <- data %>% 
  dplyr::group_by(GameID, EventID) %>% 
  dplyr::mutate(UniqueEventID = dplyr::cur_group_id())

> # A tibble: 50 x 4
> # Groups:   GameID, EventID [10]
>    GameID EventID Route UniqueEventID
>     <int>   <int> <chr>         <int>
>  1      1       1 NA                1
>  2      1       1 NA                1
>  3      1       1 NA                1
>  4      1       1 NA                1
>  5      1       1 NA                1
>  6      1       2 A                 2
>  7      1       2 B                 2
>  8      1       2 C                 2
>  9      1       2 D                 2
> 10      1       2 E                 2
> # … with 40 more rows

现在我们创建一个具有独特组合的数据框:

uniques <- table(data$UniqueEventID, data$Route) %>% 
  as.data.frame.matrix() %>% 
  dplyr::distinct()

>   A B C D E G K O T
> 1 0 0 0 0 0 0 0 0 0
> 2 1 1 1 1 1 0 0 0 0
> 5 1 1 0 0 1 1 0 0 1
> 7 0 0 0 0 1 1 1 1 1

所以每一行都是一个组合,1 表示该路线是组合的一部分。

然后要获取字符串形式的唯一组合列表,我们可以这样做:

recreate_combination <- function(...){
  r <- list(...)
  nms <- names(r)
  vals <- unname(r)
  nms[vals == 1]
}

uniques %>% 
  purrr::pmap(.f = recreate_combination)

> [[1]]
> character(0)
> 
> [[2]]
> [1] "A" "B" "C" "D" "E"
> 
> [[3]]
> [1] "A" "B" "E" "G" "T"
> 
> [[4]]
> [1] "E" "G" "K" "O" "T"

当然我们可以删除全零行并避免 character(0) 组合等

或许,您可以从数据中删除所有 'NULL' 值,并为每个 GameIDEventID 折叠一个字符串中的 Route 值。

library(dplyr)

df %>%
  filter(Route != 'NULL') %>%
  group_by(GameID, EventID) %>%
  summarise(Route = toString(Route)) %>%
  ungroup

#  GameID EventID Route                               
#   <int>   <int> <chr>                               
#1   2793      15 Fade-BackShoulder, Curl, Go/Fly, Out

使用base R

aggregate(Route ~ ., subset(df, Route != "NULL"), FUN = toString)