如何创建仅首个匹配条件为TRUE的R语言逻辑向量?
在R中生成仅首个匹配元素为TRUE的逻辑向量
假设我们有这样的向量:
v <- rep(1:4, 3)
如果直接用v == 3会把所有等于3的元素都标记为TRUE,但我们只需要第一个匹配项为TRUE,其余为FALSE。这里给你几个更简洁的实现方式:
1. 结合cummax的简洁写法
cummax(v == 3) == 1 & v == 3
逻辑很简单:先通过v == 3找出所有匹配项,cummax会把第一个TRUE之后的所有位置都变成TRUE,再和原匹配向量取交集,就只留下第一个TRUE了。
2. 用match直接定位首个索引
seq_along(v) == match(3, v)
match(3, v)直接返回第一个等于3的元素索引,再和向量的位置序列做比较,一步生成目标逻辑向量,比你之前用min(which(...))更简洁。
3. 借助duplicated去重
(v == 3) & !duplicated(v == 3)
先标记所有匹配项,duplicated会把重复出现的TRUE标记为TRUE,取反后就只剩下第一个TRUE了,剩下的匹配项都会被过滤掉。
4. 用replace直接赋值
replace(logical(length(v)), match(3, v), TRUE)
先创建一个和v长度相同的全FALSE向量,再把首个匹配的位置替换成TRUE,写法直观易懂。
内容的提问来源于stack exchange,提问作者Maël
相关产品推荐
相关产品推荐

