[英]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.table
, rleid
根據相鄰元素之間的差異給出 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.