R:检测序列

时间:2015-09-06 03:08:45

标签: r

假设我有一个数字向量,有一些数字是顺序的,有些则不是:

x <- c(1,2,3,5,6,7,8,11,14,16,17)

我如何操纵这个以便返回一个字符串,使序列组合在一起?

y <- "1-3, 5-8, 11, 14, 16-17"

1 个答案:

答案 0 :(得分:5)

我们通过使用diff比较相邻元素来创建分组变量('gr'),检查不是1的输出,执行cumsum。我们在tapplypaste'{'}中的range元素中使用了这个。

gr <- cumsum(c(TRUE,diff(x)!=1))
y <- unname(tapply(x, gr, FUN= function(.x)
                  paste(unique(range(.x)), collapse='-')))

如果我们需要一个字符串,paste使用toString“y”一起使用paste(..., collapse=', ') y <- toString(y) y #[1] "1-3, 5-8, 11, 14, 16-17"

data.table

我们也可以使用任何聚合方法来执行此操作。例如,使用cumsum(...),我们将'x'转换为'data.table',按'gr'(使用paste创建),我们将toString元素组合在一起,并使用{ {1}}和以前一样。

library(data.table)
y1 <- setDT(list(x))[,paste(unique(range(V1)), collapse='-') ,
                 by = .(cumsum(c(TRUE, diff(V1)!=1)))]$V1
toString(y1)
#[1] "1-3, 5-8, 11, 14, 16-17"