R: Соединение последовательных элементов в новые отдельные столбцы - PullRequest
1 голос
/ 15 апреля 2020

Имеется таблица со столбцом неуникальных элементов (здесь, Name) и еще два столбца: один с метками (Group), которые уникальны только в группе первых столбцов, а третий содержит значения (Delay) Я пытаюсь получить таблицу, содержащую столбцы для имени и группы, и третий столбец с группой следующего наибольшего значения задержки. Если нет следующего наивысшего значения, тогда нет строки.

Таким образом, для набора данных, такого как:

df = data.frame(
  Name =    c('lorem', 'lorem', 'lorem', 'lorem', 'lorem', 'ipsum', 'ipsum', 'ipsum', 'ipsum', 'ipsum', 'dolor', 'dolor', 'dolor', 'dolor', 'dolor', 'dolor', 'amet', 'amet', 'amet', 'amet', 'amet', 'amet'), 
  Group =   c('E', 'D', 'C', 'B', 'A', 'E', 'D', 'C', 'B', 'A', 'C', 'A', 'B', 'D', 'F', 'E', 'C', 'A', 'B', 'D', 'F', 'E'), 
  Delay =   c(5, 32, 59, 86, 113, 0, 27, 54, 81, 108, 10, 37, 64, 91, 111, 118, 0, 27, 54, 81, 101, 108)
  )
   Name Group Delay
1  lorem     E     5
2  lorem     D    32
3  lorem     C    59
4  lorem     B    86
5  lorem     A   113
6  ipsum     E     0
7  ipsum     D    27
8  ipsum     C    54
9  ipsum     B    81
10 ipsum     A   108
11 dolor     C    10
12 dolor     A    37
13 dolor     B    64
14 dolor     D    91
15 dolor     F   111
16 dolor     E   118
17  amet     C     0
18  amet     A    27
19  amet     B    54
20  amet     D    81
21  amet     F   101
22  amet     E   108

Желаемый результат будет (хотя при сохранении более высокой задержки значение для каждой пары не повредит):

Name    Source  Target
lorem   E       D
lorem   D       C
lorem   C       B
ipsum   B       A
ipsum   E       D
ipsum   D       C
ipsum   C       B
ipsum   B       A
dolor   C       A
dolor   A       B
dolor   B       D
dolor   D       F
dolor   F       E
amet    C       A
amet    A       B
amet    B       D
amet    F       E

В конечном итоге, это go в граф sankeyNetwork с использованием пакета networkD3.

Я попробовал следующее, глядя на следующая строка для соответствия в имени (после сортировки), хотя это не сработало, как ожидалось, для моих фактических данных, но также ничего не делает с фиктивными данными:

l = data.frame(Name = character(), From = character(), Target = character())

for(i in 1:(nrow(df) - 1)){
  if(df$Name[i] == df$Name[i + 1])
  {
    From = as.character(df$Group[i])
    Target = as.character(df$Group[i + 1])
    Name = as.character(df$Name[i])
  }
  links = rbind(l, list(Name = as.character(Name), From = as.character(From), Target = as.character(Target)))
}

1 Ответ

1 голос
/ 15 апреля 2020

Мы можем сделать группу и взять lead

library(dplyr)
df %>%
   group_by(Name) %>%
   transmute(Source = Group, 
             Target = lead(Group, order_by = Delay),
             Value = lead(Delay, order_by = Delay)) %>%
   na.omit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...