R 选择以特定值开始和结束并受另一列限制的随机长度序列

R 选择以特定值开始和结束并受另一列限制的随机长度序列,r,R,我有一个相当大的数据集,其形式如下表所示: value ID 1 0 A 2 0 A 3 1 A 4 1 A 5 0 A 6 -1 A 7 0 B 8 1 B 9 1 B 10 0 B 11 0 B 12 0 B 13 1 C 14 1 C 15 0 C 16 1 C 17 1 C 18 1 C

我有一个相当大的数据集,其形式如下表所示:

   value ID
1      0  A
2      0  A
3      1  A
4      1  A
5      0  A
6     -1  A
7      0  B
8      1  B
9      1  B
10     0  B
11     0  B
12     0  B
13     1  C
14     1  C
15     0  C
16     1  C
17     1  C
18     1  C
19     0  C
基本上,我想对上述内容进行转换,只保留序列的第一个和最后一个值,这些值从零开始,后跟未知数量的1,并在最后一个1结束:

   value ID
2      0  A
4      1  A
7      0  B
9      1  B
15     0  C
18     1  C
有没有一个简单的方法来实现这一点? 第一个示例的dput如下所示:

structure(list(value = structure(c(2L, 2L, 3L, 3L, 2L, 1L, 2L, 
3L, 3L, 2L, 2L, 2L, 3L, 3L, 2L, 3L, 3L, 3L, 2L), .Label = c("-1", 
"0", "1"), class = "factor"), ID = structure(c(1L, 1L, 1L, 1L, 
 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label =  c("A", "B", "C"), class = "factor")), .Names = c("value", "ID"), row.names = c(NA, -19L), class = "data.frame")

下面是我使用
data.table
stringi
包组合的尝试

library(stringi)
library(data.table)
setDT(df)[, .(.I[stri_locate_all_regex(paste(value, collapse = ""), "01+")[[1]]], 0:1), by = ID]
#    ID V1 V2
# 1:  A  2  0
# 2:  A  4  1
# 3:  B  7  0
# 4:  B  9  1
# 5:  C 15  0
# 6:  C 18  1

这基本上将每个组转换为单个字符串,然后在从行索引
.I
进行子集设置时检测与
01+
正则表达式匹配的部分的开头和结尾。最后,我只是将
0:1
添加到数据中(至少对我来说这似乎是多余的)。

您的意思是在
ID
的每个值中,您希望第一行
value=0
和最后一行
value=1
?为什么要为输出表的第一行选择第2行而不是第1行?我只想在值后面跟一个值=1时保留值=0,而不是第一个值=0。对于指定表单的任何输入数据帧,输出的格式不是
data.frame(value=rep(0:1,length(unique(df$ID)),ID=rep(unique(df$ID),each=2))
?还是具体的行号很重要?或者是否有一些
ID
的值没有起始零或结束1?@eipi10
rep(0:1,长度(唯一的(df$ID))
可以用
0:1
代替。除此之外,可能是某个
ID
将具有多个
01+
模式序列。尝试做
df[11:12,1]