R按组计算胜利实例
R Count instances of victory by group
我有一个数据框 'df',我想在其中总结每个 'user' 在每个头对头 'game' 中有多少次具有更高的 'total' 值。我的数据框如下所示:
game
user
total
1
L
55
1
J
60
2
L
64
2
J
77
3
L
90
3
J
67
4
L
98
4
J
88
5
L
71
5
J
92
摘要会指出 L 在 2 场比赛中得分更高,而 J 在 3 场比赛中得分更高。
谢谢!
这是您想要的输出类型吗?
library(tidyverse)
df <- structure(list(game = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L),
user = c("L", "J", "L", "J", "L", "J", "L", "J", "L", "J"),
total = c(55L, 60L, 64L, 77L, 90L, 67L, 98L, 88L, 71L, 92L)
), class = "data.frame", row.names = c(NA, -10L))
df %>%
group_by(game) %>%
slice_max(order_by = total,
n = 1,
with_ties = TRUE) %>%
group_by(user) %>%
summarise(wins = n())
#> # A tibble: 2 × 2
#> user wins
#> <chr> <int>
#> 1 J 3
#> 2 L 2
由 reprex package (v2.0.1)
于 2022-01-20 创建
编辑
如果您有平局,则上述方法对两个用户都将其计为 'win'。要将两个用户的平局计算为 'no winner'(例如,在下面的游戏 1 中显示),您可以使用:
library(tidyverse)
df <- structure(list(game = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L),
user = c("L", "J", "L", "J", "L", "J", "L", "J", "L", "J"),
total = c(55L, 55L, 64L, 77L, 90L, 67L, 98L, 88L, 71L, 92L)
), class = "data.frame", row.names = c(NA, -10L))
df
#> game user total
#> 1 1 L 55
#> 2 1 J 55
#> 3 2 L 64
#> 4 2 J 77
#> 5 3 L 90
#> 6 3 J 67
#> 7 4 L 98
#> 8 4 J 88
#> 9 5 L 71
#> 10 5 J 92
df %>%
group_by(game) %>%
distinct(total, .keep_all = TRUE) %>%
filter(n() >= 2) %>%
slice_max(order_by = total,
n = 1,
with_ties = FALSE) %>%
group_by(user) %>%
summarise(win = n())
#> # A tibble: 2 × 2
#> user win
#> <chr> <int>
#> 1 J 2
#> 2 L 2
由 reprex package (v2.0.1)
于 2022-01-20 创建
假设 df 是你的数据框,下面应该给你完整的摘要。
df %>%
arrange(game,desc(total)) %>% #we sort descending to ensure winner row is first.
group_by(game) %>% # we group the rows per game, this allows for winner row to be first in each group
slice_head(n=1)%>% #get first row in each group i.e winner row
ungroup()
输出:
# A tibble: 5 × 3
game user total
<int> <chr> <int>
1 1 J 60
2 2 J 77
3 3 L 90
4 4 L 98
5 5 J 92
如果您只想要用户明智的摘要,请将 count 添加到代码中,如下所示:
df %>%
arrange(game,desc(total)) %>% #we sort descending to ensure winner row is first.
group_by(game) %>% # we group the rows per game, this allows for winner row to be first in each group
slice_head(n=1) %>% #get first row in each group i.e winner row
ungroup() %>%
count(user)
输出:
# A tibble: 2 × 2
user n
<chr> <int>
1 J 3
2 L 2
与 Vinay 相同的方法,使用 data.table
library(data.table)
setDT(df)
df[order(total), tail(.SD, 1), game][, .N, user]
#> user N
#> <char> <int>
#> 1: J 3
#> 2: L 2
由 reprex package (v2.0.1)
创建于 2022-01-19
使用的数据:
df <- structure(list(game = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L
), user = c("L", "J", "L", "J", "L", "J", "L", "J", "L", "J"),
total = c(55L, 60L, 64L, 77L, 90L, 67L, 98L, 88L, 71L, 92L
)), row.names = c(NA, -10L), class = "data.frame")
我们可以按游戏对数据进行分组,slice_max
然后 count
结果数据。
library(tidyverse)
df %>% group_by(game) %>%
slice_max(total) %>%
ungroup() %>%
count(user)
#> # A tibble: 2 × 2
#> user n
#> <chr> <int>
#> 1 J 3
#> 2 L 2
由 reprex package (v2.0.1)
于 2022 年 1 月 20 日创建
请注意,如果出现平局,两队都会加一分:
library(tidyverse)
df <-
read_table('game user total
1 L 60
1 J 60
2 L 64
2 J 77
3 L 90
3 J 67
4 L 98
4 J 88
5 L 71
5 J 92')
df %>% group_by(game) %>%
slice_max(total) %>%
ungroup() %>%
count(user)
#> # A tibble: 2 × 2
#> user n
#> <chr> <int>
#> 1 J 3
#> 2 L 3
由 reprex package (v2.0.1)
于 2022 年 1 月 20 日创建
我有一个数据框 'df',我想在其中总结每个 'user' 在每个头对头 'game' 中有多少次具有更高的 'total' 值。我的数据框如下所示:
game | user | total |
---|---|---|
1 | L | 55 |
1 | J | 60 |
2 | L | 64 |
2 | J | 77 |
3 | L | 90 |
3 | J | 67 |
4 | L | 98 |
4 | J | 88 |
5 | L | 71 |
5 | J | 92 |
摘要会指出 L 在 2 场比赛中得分更高,而 J 在 3 场比赛中得分更高。
谢谢!
这是您想要的输出类型吗?
library(tidyverse)
df <- structure(list(game = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L),
user = c("L", "J", "L", "J", "L", "J", "L", "J", "L", "J"),
total = c(55L, 60L, 64L, 77L, 90L, 67L, 98L, 88L, 71L, 92L)
), class = "data.frame", row.names = c(NA, -10L))
df %>%
group_by(game) %>%
slice_max(order_by = total,
n = 1,
with_ties = TRUE) %>%
group_by(user) %>%
summarise(wins = n())
#> # A tibble: 2 × 2
#> user wins
#> <chr> <int>
#> 1 J 3
#> 2 L 2
由 reprex package (v2.0.1)
于 2022-01-20 创建编辑
如果您有平局,则上述方法对两个用户都将其计为 'win'。要将两个用户的平局计算为 'no winner'(例如,在下面的游戏 1 中显示),您可以使用:
library(tidyverse)
df <- structure(list(game = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L),
user = c("L", "J", "L", "J", "L", "J", "L", "J", "L", "J"),
total = c(55L, 55L, 64L, 77L, 90L, 67L, 98L, 88L, 71L, 92L)
), class = "data.frame", row.names = c(NA, -10L))
df
#> game user total
#> 1 1 L 55
#> 2 1 J 55
#> 3 2 L 64
#> 4 2 J 77
#> 5 3 L 90
#> 6 3 J 67
#> 7 4 L 98
#> 8 4 J 88
#> 9 5 L 71
#> 10 5 J 92
df %>%
group_by(game) %>%
distinct(total, .keep_all = TRUE) %>%
filter(n() >= 2) %>%
slice_max(order_by = total,
n = 1,
with_ties = FALSE) %>%
group_by(user) %>%
summarise(win = n())
#> # A tibble: 2 × 2
#> user win
#> <chr> <int>
#> 1 J 2
#> 2 L 2
由 reprex package (v2.0.1)
于 2022-01-20 创建假设 df 是你的数据框,下面应该给你完整的摘要。
df %>%
arrange(game,desc(total)) %>% #we sort descending to ensure winner row is first.
group_by(game) %>% # we group the rows per game, this allows for winner row to be first in each group
slice_head(n=1)%>% #get first row in each group i.e winner row
ungroup()
输出:
# A tibble: 5 × 3
game user total
<int> <chr> <int>
1 1 J 60
2 2 J 77
3 3 L 90
4 4 L 98
5 5 J 92
如果您只想要用户明智的摘要,请将 count 添加到代码中,如下所示:
df %>%
arrange(game,desc(total)) %>% #we sort descending to ensure winner row is first.
group_by(game) %>% # we group the rows per game, this allows for winner row to be first in each group
slice_head(n=1) %>% #get first row in each group i.e winner row
ungroup() %>%
count(user)
输出:
# A tibble: 2 × 2
user n
<chr> <int>
1 J 3
2 L 2
与 Vinay 相同的方法,使用 data.table
library(data.table)
setDT(df)
df[order(total), tail(.SD, 1), game][, .N, user]
#> user N
#> <char> <int>
#> 1: J 3
#> 2: L 2
由 reprex package (v2.0.1)
创建于 2022-01-19使用的数据:
df <- structure(list(game = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L
), user = c("L", "J", "L", "J", "L", "J", "L", "J", "L", "J"),
total = c(55L, 60L, 64L, 77L, 90L, 67L, 98L, 88L, 71L, 92L
)), row.names = c(NA, -10L), class = "data.frame")
我们可以按游戏对数据进行分组,slice_max
然后 count
结果数据。
library(tidyverse)
df %>% group_by(game) %>%
slice_max(total) %>%
ungroup() %>%
count(user)
#> # A tibble: 2 × 2
#> user n
#> <chr> <int>
#> 1 J 3
#> 2 L 2
由 reprex package (v2.0.1)
于 2022 年 1 月 20 日创建请注意,如果出现平局,两队都会加一分:
library(tidyverse)
df <-
read_table('game user total
1 L 60
1 J 60
2 L 64
2 J 77
3 L 90
3 J 67
4 L 98
4 J 88
5 L 71
5 J 92')
df %>% group_by(game) %>%
slice_max(total) %>%
ungroup() %>%
count(user)
#> # A tibble: 2 × 2
#> user n
#> <chr> <int>
#> 1 J 3
#> 2 L 3
由 reprex package (v2.0.1)
于 2022 年 1 月 20 日创建