【问题标题】:How to split vector into list based on consecutive unique values如何根据连续的唯一值将向量拆分为列表
【发布时间】:2017-08-06 20:54:24
【问题描述】:

我正在尝试查看是否有更好的方法将向量拆分为列表,以便将所有连续的唯一值放在一个组中。

请注意,当x 也是字符时,该方法必须有效。

#DATA
x = c(0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7)
x
#[1] 0 0 0 7 7 7 7 0 0 0 0 0 0 0 7 7 7 7

#DESIRED OUTPUT
L = list(c(0, 0, 0), c(7, 7, 7, 7), c(0, 0, 0, 0, 0, 0, 0), c(7, 7, 7, 7))
L
#[[1]]
#[1] 0 0 0

#[[2]]
#[1] 7 7 7 7

#[[3]]
#[1] 0 0 0 0 0 0 0

#[[4]]
#[1] 7 7 7 7

#CURRENT APPROACH
split_vector = 0
for (i in 2:length(x)){
     split_vector[i] = ifelse(x[i] != x[i-1], max(split_vector) + 1, split_vector[i-1])
}
split(x, split_vector)
#$`0`
#[1] 0 0 0

#$`1`
#[1] 7 7 7 7

#$`2`
#[1] 0 0 0 0 0 0 0

#$`3`
#[1] 7 7 7 7

【问题讨论】:

    标签: r


    【解决方案1】:

    这里有一些替代方案:

    1) 使用rlerep 形成一个分组向量并在其上进行拆分。没有使用任何包。

    split(x, with(rle(x), rep(seq_along(values), lengths)))
    

    给予:

    $`1`
    [1] 0 0 0
    
    $`2`
    [1] 7 7 7 7
    
    $`3`
    [1] 0 0 0 0 0 0 0
    
    $`4`
    [1] 7 7 7 7
    

    2) 使用 data.table 包中的rleid 更加容易:

    library(data.table)
    split(x, rleid(x))
    

    【讨论】:

      【解决方案2】:
      tapply(x, cumsum(c(TRUE, diff(x) != 0)), identity)
      
      $`1`
      [1] 0 0 0
      
      $`2`
      [1] 7 7 7 7
      
      $`3`
      [1] 0 0 0 0 0 0 0
      
      $`4`
      [1] 7 7 7 7
      
      # Character example
      x <- rep(c("a", "b", "c", "a"), c(4, 3, 2, 4))
      x
      
      [1] "a" "a" "a" "a" "b" "b" "b" "c" "c" "a" "a" "a" "a"
      
      # Character version
      tapply(x, cumsum(c(TRUE, x[-1] != x[-length(x)])), identity)
      
      $`1`
      [1] "a" "a" "a" "a"
      
      $`2`
      [1] "b" "b" "b"
      
      $`3`
      [1] "c" "c"
      
      $`4`
      [1] "a" "a" "a" "a"
      

      【讨论】:

      • 酷。对于角色,tapply(x, cumsum(c(TRUE, diff(as.numeric(as.factor(x))) != 0)), I) 有效
      猜你喜欢
      • 2023-04-06
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 2017-01-19
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多