在通过布尔索引向量过滤后,是否有用于获取向量中最小元素的索引的 R 习语?

Tom*_*ich 6 indexing boolean r

假设我有一个向量,例如

x <- c(7,2,8,1,6,5)
Run Code Online (Sandbox Code Playgroud)

和一个布尔向量,如

b <- c(TRUE,FALSE,FALSE,FALSE,TRUE,FALSE)
Run Code Online (Sandbox Code Playgroud)

我想找到的最小元素的索引x用于该元素对应的b是TRUE。但是,如果我写

which.min(x[b])
Run Code Online (Sandbox Code Playgroud)

它返回 2,因为x[b]计算结果为c(7,6)。相反,我想在索引x之前获得 5,即向量中的相应索引b。我可以写

(1:6)[b][which.min(x[b])]
Run Code Online (Sandbox Code Playgroud)

但这不是很可读!有没有更易读的方式?

MrF*_*ick 5

执行之后x[b],结果向量没有值的原始索引的内存。那个信息丢失了。另一种方法是将 FALSE 的值更改为非常大的值。例如

which.min(ifelse(b, x, Inf))
# [1] 5
Run Code Online (Sandbox Code Playgroud)

另一种选择是

which(b)[which.min(x[b])] 
Run Code Online (Sandbox Code Playgroud)

因为which(b)基本上是一样的(1:6)[b]