从数字串中检测范围

tri*_*iub 2 r vector range

我有一个看起来像这样的矢量

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

G. *_*eck 5

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)

以上都不需要任何外部包.