簡體   English   中英

如何基於連續的唯一值將向量拆分為列表

[英]How to split vector into list based on consecutive unique values

我試圖看看是否有更好的方法將向量拆分為列表,以便將所有連續的唯一值放在一組中。

請注意,當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

以下是一些替代方案:

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)使用rleid包中的rleid更加容易:

library(data.table)
split(x, rleid(x))
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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM