在逻辑向量中定位从FALSE到TRUE的切换索引(一行代码实现)
一行代码找出逻辑向量中从FALSE切换到TRUE的位置索引
嘿,这个需求用基础R就能轻松实现,给你两种简洁的一行代码方案,都能完美解决问题:
方法一:利用差分(diff)函数
这是最常用的思路,核心是通过差分捕捉“从0到1”的切换:
# 先定义一个示例逻辑向量 vec <- c(FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE) # 一行代码得到切换位置 which(diff(vec) == 1) + 1
原理解释:
逻辑向量在参与数值运算时会自动转为整数(FALSE=0,TRUE=1),diff(vec)会计算相邻元素的差值(后项减前项)。当从FALSE切换到TRUE时,差值正好是1。我们用which()找出这些差值为1的索引,但注意diff的结果比原向量短一位,所以要给结果加1,才能对应原向量中切换发生的位置。
运行上面的代码会得到[1] 3 6,正好对应示例向量中第3和第6个元素(从FALSE切换到TRUE的位置)。
方法二:直接对比前后元素
如果觉得差分不够直观,也可以直接对比每个元素和它的前一个元素:
which(vec & !c(FALSE, vec[-length(vec)]))
原理解释:
c(FALSE, vec[-length(vec)])生成了一个和原向量长度相同的向量,每个位置对应原向量的前一个元素(第一个位置补FALSE,因为它没有前项)。然后我们筛选出“当前元素是TRUE且前一个元素是FALSE”的位置,就是我们要找的切换点。运行结果和方法一完全一致。
这两种方法都是纯基础R实现,不需要额外包,而且都是一行代码就能搞定~
内容的提问来源于stack exchange,提问作者pepece
相关产品推荐
相关产品推荐

