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

问题描述 投票:0回答:1

这是R: Pairing of consecutive items into new separate 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 density_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的density_rank()似乎可以帮助将排名相差1的组配对。

r dplyr reshape
1个回答
0
投票

好像我使用density_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"))
© www.soinside.com 2019 - 2024. All rights reserved.