Группировка значений ранга в r

Я пытаюсь собрать значения рангов в циклах. От ранга 1 до ранга 2 - цикл1, аналогично от ранга 2 до ранга 3 - цикл2, и так далее, и создайте двоичные значения для каждого цикла (как показано ниже)

Фрейм данных перед

id               event              date                   rank       
1241a21ef        one             2016-08-13 20:03:37         1
1241a21ef        two             2016-08-15 05:41:09         2
12426203b        two             2016-08-04 05:35:10         1
12426203b       three            2016-08-06 02:07:41         2
12426203b        two             2016-08-10 05:42:33         3
12426203b       three            2016-08-14 02:43:16         4

Кадр данных после

id           cycle1     cycle2   cycle3
1241a21ef      1          0         0
12426203b      1          1         1

Примечание. Каждая группа (то есть идентификатор) имеет уникальное значение ранга на основе отметки времени, и ранг будет сброшен на 1 для следующего нового идентификатора.

1 ответ

Решение

Ты можешь использовать dplyr::count вместе с tidyr::spread чтобы получить данные в табличном виде в желаемом формате как:

library(dplyr)
library(tidyr)

df %>% group_by(id) %>%
  arrange(id, rank) %>%   
  filter(rank != last(rank)) %>%   #drop last rank for each id
  mutate(cycle = paste0("cycle", rank)) %>%  #desired column names after spread
  group_by(id, cycle) %>%
  count() %>%
  spread(key = cycle, value = n, fill = 0) %>%
  as.data.frame() 





#          id cycle1 cycle2 cycle3
# 1 1241a21ef      1      0      0
# 2 12426203b      1      1      1

Данные:

df <- read.table(text =
"id               event              date                   rank       
1241a21ef        one             '2016-08-13 20:03:37'         1
1241a21ef        two             '2016-08-15 05:41:09'         2
12426203b        two             '2016-08-04 05:35:10'         1
12426203b       three            '2016-08-06 02:07:41'         2
12426203b        two             '2016-08-10 05:42:33'         3
12426203b       three            '2016-08-14 02:43:16'         4",
header = TRUE, stringsAsFactors = FALSE)
Другие вопросы по тегам