首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:检测序列

R:检测序列
EN

Stack Overflow用户
提问于 2015-09-06 03:08:44
回答 1查看 98关注 0票数 3

假设我有一个数字向量,它有一些按顺序排列的数字,还有一些不是:

代码语言:javascript
复制
x <- c(1,2,3,5,6,7,8,11,14,16,17)

我如何操作这一点,以便返回一个字符串,以便将序列分组在一起?

代码语言:javascript
复制
y <- "1-3, 5-8, 11, 14, 16-17"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-06 03:11:01

我们通过使用diff比较相邻的元素来创建一个分组变量('gr'),检查不是1的输出,执行cumsum。我们在tapply中使用它来paste 'x‘中元素的range

代码语言:javascript
复制
gr <- cumsum(c(TRUE,diff(x)!=1))
y <- unname(tapply(x, gr, FUN= function(.x)
                  paste(unique(range(.x)), collapse='-')))

如果我们需要一个字符串,使用paste将'y‘放在一起,toStringpaste(..., collapse=', ')的包装器

代码语言:javascript
复制
y <- toString(y)
y
#[1] "1-3, 5-8, 11, 14, 16-17"

我们也可以使用任何一个按组聚合的方法来完成这个任务。例如,使用data.table,我们将'x‘转换为'data.table',按'gr’分组(使用cumsum(...)创建),我们将元素放在一起,并像以前一样使用toString

代码语言:javascript
复制
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"
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32419637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档