【发布时间】:2018-09-15 11:43:19
【问题描述】:
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 列的运行长度类型ID 的列(如data.table::rleid 产生,但忽略NA)。正如你所看到的,我们还有seq_break 列,它应该结束一个序列。它通常会这样做,例如group = NA 然后seq_break = TRUE。但有时seq_break = TRUE 和组是A 或B - 那么即使下一行指的是同一个组,也应该结束序列并开始新的序列。因此,例如对于行25:26,我们应该有两个不同的序列ID,即使两个事件都指向组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 实现这一目标?
【问题讨论】: