2013-10-08 2 views
1

У меня есть вектор переменных:which.min() со случайной выборки

x<-runif(1000,0,1) 

Я хотел бы выбрать элемент с наименьшим значением:

x[which.min(x)]

По умолчанию which.min(x) будет верните первый элемент, который удовлетворяет этому условию, однако может случиться, что существует несколько одинаково низких элементов.

есть способ отбирать эти значения и возвращать только один?

+1

Но если они все-таки, почему вам все равно, какой из них возвращен? –

+1

@ SimonO101, я думаю, что 'which.min' возвращает позицию, а не значение? – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto благодарит (надеюсь), что я это сделал, я добавил ответ, если это так. –

ответ

3

Используйте which, чтобы найти индексы всех тех элементов, которые равны минимуму вектора и произвольно отбирают один (если только минимальное значение не появляется один раз - тогда мы можем просто вернуть его).

# Find indices of minima of vector 
ids <- which(x == min(x)) 

# If the minimum value appear multiple times pick one index at random otherwise just return its position in the vector 
if(length(ids) > 1) 
    ids <- sample(ids , 1) 

# You can use 'ids' to subset as per usual 
x[ids] 
+0

Я собирался предложить то же самое, но вы нужно работать над этим. Помните, что «образец» делает, когда вы выбираете из одного номера (например, «sample (300, 1)». – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto good catch! Обновление ... –

+1

OK. Теперь у вас может быть мой голос :) – A5C1D2H2I1M1N2O1R2T1

2

Другого подобный подход, но один, который не использует if, чтобы сделать sample с seq_along совпавших значений.

Вот два примера. x1 имеет несколько значений min. x2 имеет только один.

## Make some sample data 
set.seed(1) 
x1 <- x2 <- sample(100, 1000, replace = TRUE) 
x2[x2 == 1][-1] <- 2 ## Make x2 have just one min value 

## Identify the minimum values, and extract just one of them. 
y <- which(x1 == min(x1)) 
y[sample(seq_along(y), 1)] 
# [1] 721 

z <- which(x2 == min(x2)) 
z[sample(seq_along(z), 1)] 
# [1] 463 
Смежные вопросы