【问题标题】:Create Group from Sequences [duplicate]从序列创建组[重复]
【发布时间】:2020-05-31 17:04:26
【问题描述】:

如何创建一个“组”向量来识别另一个向量中相同值的序列。

从这里

x <- c(0,1,0,0,1,0,1)

我想创建这个

outcome <- c(1,2,3,3,4,5,6)

[1] 0 1 0 0 1 0 1
[1] 1 2 3 3 4 5 6

因此,只要有相同值的新序列,就会有一个新的组号(或者也可以是数字以外的东西)。


我实际上会知道到达那里的方法,但它们都很可怕。我能想到的最好的是

comparison <- x != lag(x)
cumsum(replace_na(comparison, TRUE))

但就像我说的 - 可怕。一定有更好的方法,我希望有人知道。

【问题讨论】:

标签: r


【解决方案1】:

我们可以从data.table使用rleid

library(data.table)
rleid(x)
#[1] 1 2 3 3 4 5 6

或者在base R 和rle

with(rle(x), rep(seq_along(values), lengths))
#[1] 1 2 3 3 4 5 6

或者如果我们使用 OP 中的类似方法

1 + cumsum(x != dplyr::lag(x, default = first(x)))

【讨论】:

    【解决方案2】:

    如果x总是只有0和1,另一种选择是

    cumsum(c(1, (x[-1] + head(x, -1)) %% 2))
    
    [1] 1 2 3 3 4 5 6
    

    【讨论】:

      【解决方案3】:

      执行条件的tidyverse 版本,替换NA 并累计求和:

      library(tidyverse)
      
      if_else(outcome == lag(outcome), 0, 1) %>% 
        replace_na(1) %>% 
        cumsum()
      
      [1] 1 2 3 3 4 5 6
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-10
        • 2015-10-16
        • 1970-01-01
        • 2019-02-15
        • 2011-09-19
        • 2019-07-05
        相关资源
        最近更新 更多