R 创建一个;运行ID“;对于按顺序排列的值

R 创建一个;运行ID“;对于按顺序排列的值,r,R,我有一个向量,它包含一个有序的重复整数序列: x <- c(1, 1, 1, 2, 2, 2, 2, 3, 3, 5, 5, 5, 5, 6, 6, 9, 9, 9, 9) 我的第一个想法是简单地检查每个值是否与前一个值相同或+1,但这不起作用,因为第一个更改被视为自己的运行,显然(aFALSE被TRUEs包围): 我显然需要一些东西,让我能够将每个值与最后一个不同的值进行比较,但我想不出如何有效地做到这一点。有指针吗?使用dplyr中的lag和cumsum如何 library(dply

我有一个向量,它包含一个有序的重复整数序列:

x <- c(1, 1, 1, 2, 2, 2, 2, 3, 3, 5, 5, 5, 5, 6, 6, 9, 9, 9, 9)
我的第一个想法是简单地检查每个值是否与前一个值相同或
+1
,但这不起作用,因为第一个更改被视为自己的运行,显然(a
FALSE
TRUEs
包围):


我显然需要一些东西,让我能够将每个值与最后一个不同的值进行比较,但我想不出如何有效地做到这一点。有指针吗?

使用
dplyr
中的
lag
cumsum
如何

library(dplyr)
cumsum(x - lag(x,default = 0) > 1)+1
[1] 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3
数据表
移位的方式

library(data.table)
cumsum(x - shift(x,1,fill = 0) > 1) + 1
[1] 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3
x%
突变(上一个X=滞后(X,默认值=0),
IS.SEQ=X!=PREV.X&X!=PREV.X+1,
RZLT=1+cumsum(如下所示))
#一个tibble:19x4
X上一个X为序列RZLT
1 10假1
2 1错误1
3 1错误1
4 2 1错误1
5 2错误1
6 2错误1
7 2错误1
8 3 2错误1
9 3假1
10 5 3真实的2
11 5 5假2
1255假2
13 5 5假2
14 6 5错误2
15 6假2
16 9 6正确的3
17 9 9错误3
18 9 9假3
19 9 9错误3

使用
diff
cumsum
的基本R选项:

cumsum(c(TRUE, diff(x) > 1))
#[1] 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3
library(data.table)
cumsum(x - shift(x,1,fill = 0) > 1) + 1
[1] 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3
x <- c(1, 1, 1, 2, 2, 2, 2, 3, 3, 5, 5, 5, 5, 6, 6, 9, 9, 9, 9)



tibble(X = x) %>% 
  mutate(PREV.X = lag(X, default = 0),
         IS.SEQ = X != PREV.X & X != PREV.X + 1,
         RZLT = 1 + cumsum(IS.SEQ))

# A tibble: 19 x 4
       X PREV.X IS.SEQ  RZLT
   <dbl>  <dbl> <lgl>  <dbl>
 1     1      0 FALSE      1
 2     1      1 FALSE      1
 3     1      1 FALSE      1
 4     2      1 FALSE      1
 5     2      2 FALSE      1
 6     2      2 FALSE      1
 7     2      2 FALSE      1
 8     3      2 FALSE      1
 9     3      3 FALSE      1
10     5      3 TRUE       2
11     5      5 FALSE      2
12     5      5 FALSE      2
13     5      5 FALSE      2
14     6      5 FALSE      2
15     6      6 FALSE      2
16     9      6 TRUE       3
17     9      9 FALSE      3
18     9      9 FALSE      3
19     9      9 FALSE      3
cumsum(c(TRUE, diff(x) > 1))
#[1] 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3