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"))
这是
不过,这里没有考虑物品具有相同价值的可能性。我试图包括这些情况,以便如果组中的下一个最高值有多个项目,那么每个下一个最高的项目都会有一行。
给定以下数据:
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"))