我需要分割一个由重复元素组成的向量,每当元素值发生变化时都要进行分割。例如:
如果我尝试使用
如果有人能够帮助我找到一个更简单的解决方案,那将不胜感激!
test_vector <- c("string1", "string1", "string1", "string2",
"string2", "string1", "string1", "string3")
must become:
$`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"
如果有人能够帮助我找到一个更简单的解决方案,那将不胜感激!
split(v1, rleid(v1))
或在基础R中使用with(rle(v1), rep(seq_along(values), lengths))
。 - akrun