a <- c(1, 2, 0, 3, 7)
我正在寻找一个函数来返回最小值的索引,3。它是什么?
答案 0 :(得分:88)
您正在寻找which.min()
:
a <- c(1,2,0,3,7,0,0,0)
which.min(a)
# [1] 3
which(a == min(a))
# [1] 3 6 7 8
(从上面可以看出,当几个元素被绑定为最小值时,which.min()
只返回第一个元素的索引。如果你想要所有元素的索引,你可以使用第二个构造匹配最小值。)
答案 1 :(得分:13)
作为Josh回答的替代方案
a <- c(1, 2, 0, 3, 7)
which(a == min(a))
这给每个索引等于最小值。因此,如果我们有多个值匹配最低值
a <- c(1, 2, 0, 3, 7, 0)
which(a == min(a)) # returns both 3 and 6
which.min(a) # returns just 3
编辑:如果您正在寻找的是与最小数量相等的元素(正如您在其中一条评论中所暗示的那样),您可以这样做:
a <- c(1, 2, 0, 3, 7, 0)
sum(a == min(a))
答案 2 :(得分:2)
如果您热衷于效率,则可以使用 Rfast 包中的min_max函数,索引为True
它将返回最小值的索引和最大值的索引 同时,其价值要比到目前为止已废弃的速度更快。
例如
a = runif(10000)
Rfast::min_max(a,index=T)
# min max
# 2984 2885
which(a == min(a))
#[1] 2984
a = runif(1000000)
microbenchmark::microbenchmark(
min_max = Rfast::min_max(a,index=T),
which1 = which(a == min(a)),
which2 = which.min(a)
)
Unit: milliseconds
expr min lq mean median uq max neval
min_max 1.889293 1.9123860 2.08242647 1.9271395 2.0359730 3.527565 100
which1 9.809527 10.0342505 13.16711078 10.3671640 14.7839955 111.424664 100
which2 2.400745 2.4216995 2.66374110 2.4471435 2.5985265 4.259249 100