说我们有data.frame' a'
set.seed(666)
a <- data.frame( x= rnorm(9), y=letters[1:9] , id=c(1111:1117,1119,1121))
我希望能够找到最大的&#39; id&#39; ids开始增加之前的价值是&#39; 2&#39;而不是&#39; 1&#39;并保留所有数据,包括&#39; id&#39;对于这将是:
#> a
# x y id
#1 0.7533110 a 1111
#2 2.0143547 b 1112
#3 -0.3551345 c 1113
#4 2.0281678 d 1114
#5 -2.2168745 e 1115
#6 0.7583962 f 1116
#7 -1.3061853 g 1117
答案 0 :(得分:1)
我可能会使用rle()
来确定ID之间的第一轮差异等于1。例如
stopat <- with(rle(diff(a$id)), if(values[1]==1) lengths[1]+1 else 1)
a[1:stopat, ]
x y id
1 0.7533110 a 1111
2 2.0143547 b 1112
3 -0.3551345 c 1113
4 2.0281678 d 1114
5 -2.2168745 e 1115
6 0.7583962 f 1116
7 -1.3061853 g 1117
答案 1 :(得分:1)
另一种方法是使用diff
和match
:
> a[1:match(2, diff(a$id)),]
# x y id
#1 0.7533110 a 1111
#2 2.0143547 b 1112
#3 -0.3551345 c 1113
#4 2.0281678 d 1114
#5 -2.2168745 e 1115
#6 0.7583962 f 1116
#7 -1.3061853 g 1117
如果差异不一定等于2,您可以继续:
a[1:match(TRUE, diff(a$id)>1),]