繁体   English   中英

每次向量元素改变时在 R 中分割向量

[英]Split vector in R every time vector element changes

每次元素值更改时,我都需要拆分重复元素组的向量。 例如:

test_vector <- c("string1", "string1", "string1", "string2", 
  "string2", "string1", "string1", "string3")

必须变成:

$`1`
[1] "string1" "string1" "string1"

$`2`
[1] "string2" "string2"

$`3`
[1] "string1" "string1"

$`4`
[1] "string3"

如果我尝试split(test_vector, test_vector)我得到错误的输出:

$string1
[1] "string1" "string1" "string1" "string1" "string1"

$string2
[1] "string2" "string2"

$string3
[1] "string3"

我写了一些代码来实现这一点,但它似乎不必要地长,我觉得我错过了一些更简单的东西:

# find indices where splitting will occur:
split_points <- rep(F, length(test_vector))
for (i in 1:length(test_vector)) {
  if (i != 1) {
    if (test_vector[i] != test_vector[i-1]) {
      split_points[i] <- T
    }
  }
}
split_points <- c(1, which(split_points))

# create split vector:
split_code <- rep(1, length(test_vector))
for ( j in 1:length(split_points) ) {

  if (j!=length(split_points)) {
    split_code[
      split_points[j]:(split_points[j+1]-1)
    ] <- j
  } else {
    split_code[
      split_points[j]:length(test_vector)
    ] <- j
  }

}

split_result <- split(test_vector, split_code)
$`1`
[1] "string1" "string1" "string1"

$`2`
[1] "string2" "string2"

$`3`
[1] "string1" "string1"

$`4`
[1] "string3"

如果有人能帮我找到更简单的解决方案,我将不胜感激!

base R ,我们可以使用rle来获得向量的游程编码

grp <- with(rle(test_vector), rep(seq_along(values), lengths))

用它来split vector

split(test_vector, grp)

使用data.tablerleid根据相邻元素之间的差异给出 id

library(data.table)
split(test_vector, rleid(test_vector))
f = cumsum(c(TRUE, test_vector[-length(test_vector)] != test_vector[-1]))
split(test_vector, f)

或者

with(rle(test_vector), Map(rep, values, lengths))

甲基R选项是使用findInterval + cumsum + rle ,即

res <- split(test_vector,
             findInterval(seq_along(test_vector),
                          cumsum(rle(test_vector)$lengths),
                          left.open = TRUE))

以至于

> res
$`1`
[1] "string1" "string1" "string1"

$`2`
[1] "string2" "string2"

$`3`
[1] "string1" "string1"

$`4`
[1] "string3"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM