我有一个向量
vec <- c(2, 3, 5, 6, 7, 8, 16, 19, 22, 23, 24)
Run Code Online (Sandbox Code Playgroud)
连续的数字是:
c(2, 3)
c(5, 6, 7, 8)
c(22, 23, 24)
Run Code Online (Sandbox Code Playgroud)
所以第一个向量从 2 开始,到 3 结束;
第二个向量从 5 开始,到 8 结束;
对于第三个向量,从 22 开始,到 24 结束;
有一个函数可以识别连续数字从哪里开始和结束吗?
通过使用diff检查每个连续值之间的差异,您可以找到不存在差异的地方+1。
diff(vec)
## [1] 1 2 1 1 1 8 3 3 1 1
c(1, diff(vec)) != 1
## [1] FALSE FALSE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
然后使用cumsum来制作组标识符:
cumsum(c(1, diff(vec))!=1)
## [1] 0 0 1 1 1 1 2 3 4 4 4
Run Code Online (Sandbox Code Playgroud)
并将其用于split您的数据:
split(vec, cumsum(c(1, diff(vec))!=1))
##$`0`
##[1] 2 3
##
##$`1`
##[1] 5 6 7 8
##
##$`2`
##[1] 16
##
##$`3`
##[1] 19
##
##$`4`
##[1] 22 23 24
Run Code Online (Sandbox Code Playgroud)
可以将其Filter编辑为连续值:
Filter(\(x) length(x) > 1, split(vec, cumsum(c(1, diff(vec))!=1)))
##$`0`
##[1] 2 3
##
##$`1`
##[1] 5 6 7 8
##
##$`4`
##[1] 22 23 24
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |