structure(list(group = c(NA, "A", "B", NA, "B", "B", "B", "B",
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B",
"B", NA, NA, "B", "B", "A", "A", NA, NA, "B", "B", "B", NA, "A",
"A", "A", "A", "A", "A", "A", "A", "A", "A", NA, NA, "B", "B",
NA, "A"), seq_break = c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE,
TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE)), .Names = c("group",
"seq_break"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-50L))
В вышеприведенных данных мне нужно определить столбец, который будет содержать идентификатор типа длины строки столбца group
(например, data.table::rleid
производит, но игнорирует NA
). Как вы можете заметить, у нас есть также столбец seq_break
, который должен завершать последовательность. И это обычно так, например, когда group = NA
, затем seq_break = TRUE
. Но иногда seq_break = TRUE
и группа A
или B
- тогда последовательность должна быть закончена, и начинается новая, даже если следующая строка относится к той же группе. Так, например, для строк 25:26
у нас должно быть два разных идентификатора последовательности, даже если оба события относятся к группе B
. Как правило, ожидаемый результат показан ниже:
structure(list(group = c(NA, "A", "B", NA, "B", "B", "B", "B",
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B",
"B", NA, NA, "B", "B", "A", "A", NA, NA, "B", "B", "B", NA, "A",
"A", "A", "A", "A", "A", "A", "A", "A", "A", NA, NA, "B", "B",
NA, "A"), seq_break = c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE,
TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE), expected_output = c(NA,
1, 2, NA, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, NA, NA, 4, 5, 6, 6, NA, NA, 7, 7, 7, NA, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, NA, NA, 11, 11, NA, 12)), .Names = c("group", "seq_break",
"expected_output"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-50L))
Как мне добиться этого с tidyverse
?