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 日创建