【问题标题】:R: detecting sequencesR:检测序列
【发布时间】:2015-09-06 13:53:15
【问题描述】:

假设我有一个数字向量,其中一些数字是按顺序排列的,而另一些则不是:

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

我将如何操作它以返回一个字符串以便将序列组合在一起?

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

【问题讨论】:

    标签: r


    【解决方案1】:

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

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

    如果我们需要单个字符串,paste 'y' 一起使用 toString,它是 paste(..., collapse=', ') 的包装器

    y <- toString(y)
    y
    #[1] "1-3, 5-8, 11, 14, 16-17"
    

    我们也可以使用任何按组聚合的方法来做到这一点。例如,使用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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      • 2021-11-09
      相关资源
      最近更新 更多