Группировка значений ранга в 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)