#r
#r
Вопрос:
Я хочу написать функцию, которая дает 3 индекса нижних 3 значений вектора-точно так же, как.min, но нижние 3 индекса вместо нижнего индекса.
Я написал функцию (minfunc, ниже), которую можно вызвать с помощью apply (), чтобы найти 3 нижних значения вектора. Но прямо сейчас у меня нет функции, чтобы найти индексы этих 3 минимальных значений.
minfunc lt;- function(x) { min1 lt;- min(x) min2 lt;- min(x[x != min(x)]) min3 lt;- -sort(-x, TRUE)[3] cmin lt;- c(min1, min2, min3) return(cmin) }
Ответ №1:
Вот один из способов. Сначала предоставьте воспроизводимые данные:
set.seed(42) X lt;- sample.int(20, 20) X # [1] 17 5 1 10 4 2 20 18 8 7 16 9 19 6 14 15 12 3 13 11
Теперь индексы нижней 3:
head(order(X), 3) # [1] 3 6 18 X[head(order(X), 3)] # [1] 1 2 3
Чтобы создать функцию:
which.mins lt;- function(x, mins=3) { head(order(x), mins) } which.mins(X, 3) # [1] 3 6 18 which.mins(X, 5) # [1] 3 6 18 5 2
Комментарии:
1. Я бы использовал
order(x)[1:mins]
, так как это немного быстрее. Независимо от 12. Хорошая корректировка.
3. Спасибо, это идеально! Просто для ясности, когда я определяю функцию, которую я вижу, я могу написать функцию(x, минуты), а не функцию(x, минуты=3). Ввод =3 в любом случае ничего не меняет. Это опечатка, или есть какая-то причина для этого =3 бита? Это кажется нелогичным.
4. Это обеспечивает значение по умолчанию для
mins=
аргумента. Если вам нужно 3, вы можете просто вызвать функцию сwhich.min(X)
помощью , но если вы хотите больше или меньше, вы указываете значение дляmins=
.