求tidyverse中n列中k个元素的所有组合

tcomlyy6  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(101)

我试图计算篮球阵容的统计数据,给出了比赛数据。特别是我有一个 Dataframe ,或多或少看起来像这样
| 游戏标识|操作标识|组标识|事件|第1页|第二页|第三页|第四页|第5页|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| G1级|1个|高|3PA|A类|乙|C级|D级|E级|
| G1级|第二章|五|雷布|A类|乙|C级|D级|E级|
我想对pivot_longer进行排序,但不是用名称(p1:p5)和值(A:E)作为列,而是寻找一个函数,它允许我找到k个参与者(1〈= k〈= 5)的所有组合。例如,如果k = 2,它将是这样的:
| 游戏标识|操作标识|组标识|事件|p_组合1|p_comb2|
| - ------|- ------|- ------|- ------|- ------|- ------|
| G1级|1个|高|3PA|A类|乙|
| G1级|1个|高|3PA|A类|C级|
| G1级|1个|高|3PA|A类|D级|
| G1级|1个|高|3PA|A类|E级|
| G1级|1个|高|3PA|乙|C级|
| G1级|1个|高|3PA|乙|D级|
| G1级|1个|高|3PA|乙|E级|
| G1级|1个|高|3PA|C级|D级|
| G1级|1个|高|3PA|C级|E级|
| G1级|1个|高|3PA|D级|E级|
| G1级|第二章|五|雷布|A类|乙|
| G1级|第二章|五|雷布|A类|C级|
| G1级|第二章|五|雷布|A类|D级|
| G1级|第二章|五|雷布|A类|E级|
| G1级|第二章|五|雷布|乙|C级|
| G1级|第二章|五|雷布|乙|D级|
| G1级|第二章|五|雷布|乙|E级|
| G1级|第二章|五|雷布|C级|D级|
| G1级|第二章|五|雷布|C级|E级|
| G1级|第二章|五|雷布|D级|E级|
我的具体要求是:

  • 能够将k设置为某个函数的参数
  • 避免手动自联接(如果这不是唯一可能的解决方案)
  • 我可以在分组后执行此操作,因此我只查找相同操作内的组合,而不是数据集中的所有组合
  • 在同一管道中执行所有操作,避免lapply,并尽可能执行循环

像这样的函数存在吗?
我尝试了自连接,这实际上是一个可能的解决方案,即使它看起来不是很优雅。

xmd2e60i

xmd2e60i1#

您可以:

df %>%
  mutate(comb = apply(across(num_range('p', 1:5)), 1, function(x) as.data.frame(t(combn(x, 2))))) %>%
  unnest_longer(comb) %>%
  unpack(comb)
mcvgt66p

mcvgt66p2#

请检查以下代码

df %>% pivot_longer(starts_with('P'), names_to = 'name', values_to = 'p_comb1') %>% 
  group_by(game_id,action_id,team_id,event) %>% 
  mutate(row1=row_number(), p_comb2=p_comb1, row2=row1) %>% 
  complete(row1, row2) %>% filter(row2>row1) %>% 
  mutate(p_comb1=LETTERS[row1], p_comb2=LETTERS[row2]) %>% select(-starts_with('row'), -name)

创建于2023年1月28日,使用reprex v2.0.2

# A tibble: 10 × 6
# Groups:   game_id, action_id, team_id, event [1]
   game_id action_id team_id event p_comb1 p_comb2
   <chr>   <chr>     <chr>   <chr> <chr>   <chr>  
 1 G1      1         H       3PA   A       B      
 2 G1      1         H       3PA   A       C      
 3 G1      1         H       3PA   A       D      
 4 G1      1         H       3PA   A       E      
 5 G1      1         H       3PA   B       C      
 6 G1      1         H       3PA   B       D      
 7 G1      1         H       3PA   B       E      
 8 G1      1         H       3PA   C       D      
 9 G1      1         H       3PA   C       E      
10 G1      1         H       3PA   D       E

相关问题