假设我有一个数字向量,有一些数字是顺序的,有些则不是:
x <- c(1,2,3,5,6,7,8,11,14,16,17)
Run Code Online (Sandbox Code Playgroud)
我将如何操纵这个以便返回一个字符串,使序列组合在一起?
y <- "1-3, 5-8, 11, 14, 16-17"
Run Code Online (Sandbox Code Playgroud)
我们通过比较相邻元素来创建分组变量('gr')diff,检查不是1的输出,做cumsum.我们用这tapply来paste了range的"X"的元素.
gr <- cumsum(c(TRUE,diff(x)!=1))
y <- unname(tapply(x, gr, FUN= function(.x)
paste(unique(range(.x)), collapse='-')))
Run Code Online (Sandbox Code Playgroud)
如果我们需要一个字符串,paste'y'一起使用toString哪个是包装器paste(..., collapse=', ')
y <- toString(y)
y
#[1] "1-3, 5-8, 11, 14, 16-17"
Run Code Online (Sandbox Code Playgroud)
我们也可以使用任何聚合方法来执行此操作.例如,使用data.table,我们将'x'转换为'data.table',按'gr'(使用创建cumsum(...))分组,我们paste将元素组合在一起,并toString像以前一样使用.
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"
Run Code Online (Sandbox Code Playgroud)