查找向量中最后一次出现的唯一元素的索引

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (7)

我有一个无序的向量v,如下所示,并希望找到列表中每个唯一元素的最后一个出现的索引。

v <- scan(text="1 2 1 2 1 1 1 3 1 2 2 3 3 3 1 1 1 4 1 1 1 4 1 5 5 6
                6 2 3 3 4 4 2 2 2 2 2 3 3 3 1 4 4 4 3 2 5 5 5 5")
v
# [1] 1 2 1 2 1 1 1 3 1 2 2 3 3 3 1 1 1 4 1 1 1 4 1 5 5 6 6 2 3 3 4 4 2 2 2 2 2 3 3 3 
# [41] 1 4 4 4 3 2 5 5 5 5

预期结果(按1,2,3,4,5的顺序):

41 46 45 44 50

我知道我可以unique(unlist(v))用来找到独特的元素但是如何找到它们最后一次出现的指数?任何的想法?

提前致谢。

提问于
用户回答回答于

rle如果vector已经订购,您可以尝试。提取长度($lengths)然后cumsum。正如我之前提到的,如果它没有被排序,这将不起作用(再次取决于你真正想要的东西)。基本上rle通过检查一段中相似的连续元素的数量来工作。它将在列表中给出lengths和对应values

cumsum(rle(v1)$lengths)
#[1] 28 37 42 46 50

另一个选择是按向量对序列进行分组,并获取max每个序列的值group。我想这会很慢。

unname(cumsum(tapply(seq_along(v1),v1, FUN=which.max)))    
#[1] 28 37 42 46 50

或者只是检查前值是否相同的电流值,然后插入TRUE作为最后一个元素,并获得该指数TRUEwhich

 which(c(v1[-1]!=v1[-length(v1)],TRUE))
 #[1] 28 37 42 46 50

或者使用 match

 c(match(unique(v1),v1)-1, length(v1))[-1]
#[1] 28 37 42 46 50

或者使用 findInterval

 findInterval(unique(v1), v1)
 #[1] 28 37 42 46 50

更新

对于新的载体 v2

max.col(t(sapply(unique(v2), `==`, v2)),'last')
#[1] 41 46 45 44 50 27

或者在无序向量findInterval之后使用的函数ordering

   f1 <- function(v){
      v1 <- setNames(v, seq_along(v))
      ind <- order(v1)
      as.numeric(names(v1[ind][findInterval(unique(v1), v1[ind])]))
    }     

 f1(v2)
 #[1] 41 46 45 44 50 27

使用z@Marat talipov帖子中的例子(),

 f1(z)
 #[1] 4 5 3

注意:我按照唯一元素首次出现的顺序得到结果z。即1,然后32。如果需要根据值再次订购,可以使用order(如@Marat Talipov所述)。但是,目前尚不清楚OP在这种情况下真正想要的是什么。

数据

v1 <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 
 3, 4, 4, 4, 4, 5, 5, 5, 5)

v2 <-  c(1, 2, 1, 2, 1, 1, 1, 3, 1, 2, 2, 3, 3, 3, 1, 1, 1, 4, 1, 1, 
 1, 4, 1, 5, 5, 6, 6, 2, 3, 3, 4, 4, 2, 2, 2, 2, 2, 3, 3, 3, 1, 
 4, 4, 4, 3, 2, 5, 5, 5, 5)

 z <- c(1, 3, 2, 1, 3)
用户回答回答于
tapply(seq_along(v), v, max)
#  1  2  3  4  5  6 
# 41 46 45 44 50 27 

所属标签

可能回答问题的人

  • 学生

    3 粉丝476 提问7 回答
  • uncle_light

    5 粉丝518 提问6 回答
  • o o

    4 粉丝494 提问5 回答
  • 富有想象力的人

    3 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券