查找由另一个变量分组的所有组合
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'
值,并为每个 GameID
和 EventID
折叠一个字符串中的 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)
我正在处理如下所示的数据:
# 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'
值,并为每个 GameID
和 EventID
折叠一个字符串中的 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)