Как написать функцию, подобную which.min, но для нижних 3 значений?

#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] , так как это немного быстрее. Независимо от 1

2. Хорошая корректировка.

3. Спасибо, это идеально! Просто для ясности, когда я определяю функцию, которую я вижу, я могу написать функцию(x, минуты), а не функцию(x, минуты=3). Ввод =3 в любом случае ничего не меняет. Это опечатка, или есть какая-то причина для этого =3 бита? Это кажется нелогичным.

4. Это обеспечивает значение по умолчанию для mins= аргумента. Если вам нужно 3, вы можете просто вызвать функцию с which.min(X) помощью , но если вы хотите больше или меньше, вы указываете значение для mins= .