这是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的组配对。
好像我使用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"))