我有一个看起来像这样的矢量
c(3,4,5,6,7,10,11,14,17,18,19,54,55,56,59,61)->k
Run Code Online (Sandbox Code Playgroud)
如何轻松检测连续数字的范围
3:7,10,11,14,17:19,54:56,59,61
Run Code Online (Sandbox Code Playgroud)
并将其保存在新的向量中?在那些存在范围(:)的情况下,将此范围的中位数保存为最好是输出
5,10,11,14,18,55,59,61
Run Code Online (Sandbox Code Playgroud)
是否有任何其他解决方案快速,也可以处理不像12,3,4,5,0,7那样提升的向量
进入12,4,0,7
1)试试这个:
tapply(k, cumsum(c(TRUE, diff(k) != 1)), median)
Run Code Online (Sandbox Code Playgroud)
赠送:
1 2 3 4 5 6 7
5.0 10.5 14.0 18.0 55.0 59.0 61.0
Run Code Online (Sandbox Code Playgroud)
2)也试试这个:
f <- function(x) if (length(x) == 1) x else paste(x[1], x[length(x)], sep = ":")
tapply(k, cumsum(c(TRUE, diff(k) != 1)), f)
Run Code Online (Sandbox Code Playgroud)
赠送:
1 2 3 4 5 6 7
"3:7" "10:11" "14" "17:19" "54:56" "59" "61"
Run Code Online (Sandbox Code Playgroud)
3)和这个:
tapply(k, cumsum(c(TRUE, diff(k) != 1)), toString)
Run Code Online (Sandbox Code Playgroud)
给这个:
1 2 3 4 5
"3, 4, 5, 6, 7" "10, 11" "14" "17, 18, 19" "54, 55, 56"
6 7
"59" "61"
Run Code Online (Sandbox Code Playgroud)
4)和这:
split(k, cumsum(c(TRUE, diff(k) != 1)))
Run Code Online (Sandbox Code Playgroud)
赠送:
$`1`
[1] 3 4 5 6 7
$`2`
[1] 10 11
$`3`
[1] 14
$`4`
[1] 17 18 19
$`5`
[1] 54 55 56
$`6`
[1] 59
$`7`
[1] 61
Run Code Online (Sandbox Code Playgroud)
以上都不需要任何外部包.