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

时间:2015-11-17 22:16:46

标签: 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
19     0  C

基本上我想转换上面的内容,只保留序列的第一个和最后一个值,它们以零的出现开头,后跟未知数量的1,并在最后一次出现时结束:

   value ID
2      0  A
4      1  A
7      0  B
9      1  B
15     0  C
18     1  C

有没有简单的方法来实现这一目标? 第一个例子的输入如下:

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")

1 个答案:

答案 0 :(得分:3)

我尝试使用<groupId>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 进行子集化时检测与01+正则表达式匹配的部分的开头和结尾。最后,我只是将.I添加到数据中(至少对我来说这似乎是多余的)。