【发布时间】:2018-10-23 18:28:01
【问题描述】:
我有一个包含TRUE 重复序列的数据集,我想根据某些条件标记它 - 通过id 和序列的增量值。 FALSE 会破坏TRUEs 的序列,并且第一个破坏TRUE 的任何给定序列的FALSE 应该包含在该序列中。 TRUEs 之间的连续 FALSEs 无关紧要,标记为 0。
例如:
> test
id logical sequence
1 1 TRUE 1
2 1 TRUE 1
3 1 FALSE 1
4 1 TRUE 2
5 1 TRUE 2
6 1 FALSE 2
7 1 TRUE 3
8 2 TRUE 1
9 2 TRUE 1
10 2 TRUE 1
11 2 FALSE 1
12 2 TRUE 2
13 2 TRUE 2
14 2 TRUE 2
15 3 FALSE 0
16 3 FALSE 0
17 3 FALSE 0
18 3 TRUE 1
19 3 FALSE 1
20 3 TRUE 2
21 3 FALSE 2
22 3 FALSE 0
23 3 FALSE 0
24 3 FALSE 0
25 3 TRUE 3
等等。我考虑过使用rle() 产生
> rle(test$logical)
Run Length Encoding
lengths: int [1:13] 2 1 2 1 4 1 3 3 1 1 ...
values : logi [1:13] TRUE FALSE TRUE FALSE TRUE FALSE ...
但我不确定如何将其映射回数据框。关于如何解决这个问题的任何建议?
这里是示例数据:
> dput(test)
structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), logical = c(TRUE, TRUE,
FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE,
TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE,
FALSE, FALSE, TRUE)), .Names = c("id", "logical"), class = "data.frame", row.names = c(NA,
-25L))
【问题讨论】:
-
嗯,有什么不清楚的地方?
-
第一个破坏任何给定 TRUE 序列的 FALSE 应该包含在序列中,这有意义吗?其中
id =1,是因为如果第一个序列的2个TRUE被第一个序列中包含的一个FALSE打破(第一个序列是3行),第二个序列也是3行,因为有两个TRUE被一个 FALSE 打破。 -
感谢@akrun 我已经相应地编辑了问题
-
是的,现在好多了
-
没那么简单,但可以帮助您的功能是:
lag,rleidv,cumsum
标签: r dplyr data.table run-length-encoding