从原始序列到缩短代码的 R 序列格式
R sequence format from raw sequence to shortened code
在 R 中,我可以写一个 1 - 9 的序列,如 1:9
,它会输出 c(1,2,3,4,5,6,7,8,9)
。
我想反过来。如果我有一个 c(1,2,3,4,5,6,7,8,9)
的序列,有没有办法得到 1:9
作为输出?最好以动态方式,例如 c(1,2,3,4,6,7,8,9)
变成 c(1:4, 6:9)
?
一个选项可以是:
sapply(split(x, cumsum(c(1, diff(x)) > 1)), function(x) paste(range(x), collapse = ":"))
0 1
"1:4" "6:9"
也许是一种迂回的方式,但是您可以使用 head
和 tail
函数来获取向量的第一项和最后一项。
> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
> tail(x, n=1)
[1] 9
> head(x, n=1)
[1] 1
> head(x, n=1):tail(x, n=1)
[1] 1 2 3 4 5 6 7 8 9
我们可以使用tapply
tapply(x, cumsum(c(TRUE, diff(x) > 1)), FUN =
function(x) paste(min(x), max(x), sep=":"))
# 1 2
#"1:4" "6:9"
数据
x <- c(1,2,3,4,6,7,8,9)
在 R 中,我可以写一个 1 - 9 的序列,如 1:9
,它会输出 c(1,2,3,4,5,6,7,8,9)
。
我想反过来。如果我有一个 c(1,2,3,4,5,6,7,8,9)
的序列,有没有办法得到 1:9
作为输出?最好以动态方式,例如 c(1,2,3,4,6,7,8,9)
变成 c(1:4, 6:9)
?
一个选项可以是:
sapply(split(x, cumsum(c(1, diff(x)) > 1)), function(x) paste(range(x), collapse = ":"))
0 1
"1:4" "6:9"
也许是一种迂回的方式,但是您可以使用 head
和 tail
函数来获取向量的第一项和最后一项。
> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
> tail(x, n=1)
[1] 9
> head(x, n=1)
[1] 1
> head(x, n=1):tail(x, n=1)
[1] 1 2 3 4 5 6 7 8 9
我们可以使用tapply
tapply(x, cumsum(c(TRUE, diff(x) > 1)), FUN =
function(x) paste(min(x), max(x), sep=":"))
# 1 2
#"1:4" "6:9"
数据
x <- c(1,2,3,4,6,7,8,9)