Я пытаюсь создать подгруппы в пределах фактора на основе определенного столбца. Вот пример набора данных с именем «test», похожий на тот, с которым я работаю.
structure(list(old.id = c("A", "A", "A", "A", "A", "A", "A",
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C"
), id.number = c(1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4, 5, 6, 1, 2,
3, 4, 1, 2, 3), X = c(0.859207813394842, 0.636238617960869, 0.507899267816508,
0.400124367809121, 0.867246955862074, 0.620089503630128, 0.493032629079145,
0.702937523522877, 0.897875765710176, 0.360667580073056, 0.931321208973492,
0.298666640389948, 0.94444119643156, 0.223731238077921, 0.705733544607941,
0.354808093410256, 0.196606367677969, 0.67764700709383, 0.510474776312792,
0.214473998493235), Y = c(44, 41, 43, 61, 41, 51, 55, 34, 41,
63, 15, 77, 57, 73, 60, 71, 73, 16, 50, 19), Z = c(322, 349,
395, 300, 368, 357, 385, 306, 385, 377, 323, 335, 314, 372, 372,
362, 311, 301, 332, 314), Factor1 = c("Y", "N", "N", "N", "Y",
"N", "Y", "Y", "Y", "Y", "Y", "N", "N", "Y", "Y", "Y", "N", "Y",
"N", "N"), Factor2 = c("L", "M", "H", "L", "H", "L", "L", "M",
"H", "H", "H", "M", "L", "H", "H", "H", "L", "H", "L", "M")), row.names = c(NA,
-20L), class = c("tbl_df", "tbl", "data.frame"))
Мои две основные цели:
- анонимизировать столбец old.id
- создавать цепочки событий с новым "new.id", который определяется столбцом old.id и столбцом "id.number"
Если бы не добавленная последовательность столбца "id.number", я мог бы легко анонимизировать идентификатор с помощью
library(tidyverse)
new_test=test %>% mutate(new_id=group_indices(.,old.id))
Мне не удалось определить, как сгруппировать результаты и назначить новый идентификатор, используя "id.number". Ниже приведен результат, на который я надеюсь.
structure(list(old.id = c("A", "A", "A", "A", "A", "A", "A",
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C"
), id.number = c(1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4, 5, 6, 1, 2,
3, 4, 1, 2, 3), new.id = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3,
3, 4, 4, 4, 4, 5, 5, 5), X = c(0.859207813394842, 0.636238617960869,
0.507899267816508, 0.400124367809121, 0.867246955862074, 0.620089503630128,
0.493032629079145, 0.702937523522877, 0.897875765710176, 0.360667580073056,
0.931321208973492, 0.298666640389948, 0.94444119643156, 0.223731238077921,
0.705733544607941, 0.354808093410256, 0.196606367677969, 0.67764700709383,
0.510474776312792, 0.214473998493235), Y = c(44, 41, 43, 61,
41, 51, 55, 34, 41, 63, 15, 77, 57, 73, 60, 71, 73, 16, 50, 19
), Z = c(322, 349, 395, 300, 368, 357, 385, 306, 385, 377, 323,
335, 314, 372, 372, 362, 311, 301, 332, 314), Factor1 = c("Y",
"N", "N", "N", "Y", "N", "Y", "Y", "Y", "Y", "Y", "N", "N", "Y",
"Y", "Y", "N", "Y", "N", "N"), Factor2 = c("L", "M", "H", "L",
"H", "L", "L", "M", "H", "H", "H", "M", "L", "H", "H", "H", "L",
"H", "L", "M")), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame"))
Так что, если мы посмотрим, когда «old.id» = A и поле «id.number» возвращается к 1, это определяет новую «цепочку» событий и получает номер «new.id». Мой фактический набор данных имеет 60 столбцов и около 500 000 строк, и любое решение должно масштабироваться до миллионов строк. Я бы предпочел аккуратное решение, чтобы добавить его в существующий аккуратный конвейер, но я был бы признателен за все, что работает. Спасибо