我有一个看起来像这样的矢量:
c(1,1,1,1,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5..)
我想得到元素变化的索引,即(1,5,9,...)
我知道如何使用for循环,但我正在尝试更快的方式,因为我的向量非常大。
谢谢,
答案 0 :(得分:7)
尝试
which(c(TRUE,diff(v1)!=0))
或者
match(unique(v1), v1)
或者矢量是否已分类
head(c(1, findInterval(unique(v1), v1)+1),-1)
v1 <- c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,
4, 4, 5, 5, 5, 5, 5)
答案 1 :(得分:0)
另一种有趣的方法:
v1 <- c(1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 7, 8)
head(c(1, cumsum(rle(v1)$lengths) + 1), -1)
或者,如果您有magrittr
,那么它可以成为
library(magrittr)
v1 %>%
rle %>%
.$lengths %>%
cumsum %>%
add(1) %>%
c(1, .) %>%
head(-1)
结果:1 3 4 5 7 8 9 12
可能看起来很奇怪,但通过以下方式考虑很有趣:)
说明:cumsum(rle(v1)$lengths)
几乎可以到达那里,但是它会给你一个序列结束的索引,而不是下一个序列开始的位置,这就是我们添加的原因每个元素一个,追加索引1,并删除最后一个元素。