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?@eipi10rep(0:1,长度(唯一的(df$ID))
可以用0:1
代替。除此之外,可能是某个ID
将具有多个01+
模式序列。尝试做df[11:12,1]