R:将具有相邻排名的多个项目配对到新列中

R: Pairing multiple items with adjacent ranking into new columns

这是 的后续行动,其中根据值的比较将项目配对移入列(下一个最高值的组标签被放入新列)。

不过,这里没有考虑物品具有相同价值的可能性。我试图包括这些情况,以便如果组中的下一个最高值有多个项目,那么每个下一个最高的项目都会有一行。

给定以下数据:

df = data.frame(
  Name = c('lorem', 'lorem', 'lorem', 'lorem', 'lorem', 'ipsum', 'ipsum', 'ipsum', 'ipsum', 'ipsum', 'dolor', 'dolor', 'dolor', 'dolor', 'dolor', 'dolor'),
  Delay = c(0, 30, 80, 80, 100, 0, 30, 50, 80, 100, 0, 0, 60, 60, 100, 100),
  Group = c('E', 'D', 'C', 'B', 'A', 'E', 'D', 'C', 'B', 'A', 'C', 'A', 'B', 'D', 'F', 'E')  )

应用于延迟数字的 dplyr dense_rank() 函数提供了一种非常简洁的配对方式;在每个名称中,等级为 1 的组应与等级 2 配对,2s 依次与 3s 配对,3s 与 4s 配对...

  Name  Delay Group  Rank
   <chr> <dbl> <chr> <int>
 1 lorem     0 E         1
 2 lorem    30 D         2
 3 lorem    80 C         3
 4 lorem    80 B         3
 5 lorem   100 A         4
 6 ipsum     0 E         1
 7 ipsum    30 D         2
 8 ipsum    50 C         3
 9 ipsum    80 B         4
10 ipsum   100 A         5
11 dolor     0 C         1
12 dolor     0 A         1
13 dolor    60 B         2
14 dolor    60 D         2
15 dolor   100 F         3
16 dolor   100 E         3

因此所需的输出将是(其中 Step 只是对中较低的排名):

Name    Source  Target  Step
lorem   E       D       1
lorem   D       C       2
lorem   D       B       2
lorem   B       A       3
ipsum   E       D       1
ipsum   D       C       2
ipsum   C       B       3
ipsum   B       A       4
dolor   C       B       1
dolor   A       B       1
dolor   C       D       1
dolor   A       D       1
dolor   B       F       2
dolor   D       F       2
dolor   B       E       2
dolor   D       E       2

我不确定任何聪明的 dplyr 分组在这里是否有用(我很高兴发现它解决了上一个问题,但这似乎不能用相同的排序和外观来完成- 在下一行解决方案)。早些时候,我在想某种嵌入式循环可能是一种可行的方法,但感觉效率低得不必要。

dplyr 的 dense_rank() 似乎会有所帮助,但是,能够将排名相差 1 的组配对。

看起来我在 dense_rank() 的正确轨道上,然后自连接做了匹配偏移量的技巧:

df2 = df %>% group_by(Group) %>% mutate(Round = dense_rank(Delay),
                                       Next = Round + 1) %>%
  ungroup()
df2 = df2 %>%
  inner_join(df2, by = c("Group" = "Group", "Next" = "Round"))