R: объединение нескольких элементов с соседним рейтингом в новые столбцы - PullRequest
0 голосов
/ 28 апреля 2020

Это продолжение до R: Объединение последовательных элементов в новые отдельные столбцы , где объединения элементов были перемещены в столбцы на основе сравнения значений (метка группы следующего по наивысшему значение было помещено в новый столбец).

Однако там не учитывается вероятность того, что предметы имеют одинаковое значение. Я пытаюсь включить эти случаи так, чтобы, если у следующего наивысшего значения в группе было несколько элементов, для каждого из этих наивысших элементов будет строка.

Учитывая следующие данные:

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 dens_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 быть полезной здесь (я был счастлив обнаружить, что это решило предыдущий вопрос, но это не похоже на это можно сделать с помощью того же решения «сортируй и смотри при следующей строке»). Раньше я думал, что какой-то встроенный l oop мог бы быть способом к go, но это казалось излишне неэффективным. возможность объединить группы с рангами с разницей 1.

1 Ответ

0 голосов
/ 29 апреля 2020

Похоже, что я был на правильном пути с помощью 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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...