返回向量索引

时间:2015-04-28 06:28:19

标签: r vector

我有一个看起来像这样的矢量:

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循环,但我正在尝试更快的方式,因为我的向量非常大。

谢谢,

2 个答案:

答案 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,并删除最后一个元素。