2013-08-12 2 views
0

Это, вероятно, очень просто, но для его упрощения не хватает правильного синтаксиса.Поиск индекса минимального значения, превышающего пороговое значение в R

Для получения матрицы найдите запись в одном столбце, которое является самым низким значением, большим, чем некоторый входной параметр. Затем верните запись в другой столбец соответствующей строки. Не очень сложно ... и я нашел что-то, что работает, но более эффективное решение было бы очень благодарно.

Я нашел эту ссылку: Better way to find a minimum value that fits a condition?

который отлично .. но что метод нахождения наименьшей записи теряет индексную информацию, необходимую, чтобы найти соответствующее значение в соответствующей строке.

Скажем, столбец 2 является столбцом условия, а столбец 1 - это тот, который я хочу вернуть .... в настоящее время я сделал это: (обратите внимание, что это работает только потому, что строка вторая полна чисел, которые меньше чем 1).

matrix[which.max((matrix[,2]>threshhold)/matrix[,2]),1] 

Любые мысли? Я ожидаю, что есть, вероятно, какая-то быстрая и простая функция, которая имеет этот эффект ... это просто никогда не было представлено мне ха-ха.

+0

Что случилось с однострочником, что решает вашу проблему? Однако этот код выходит из строя, если ваше обрезание отрицательное, и есть отрицательная запись, превышающая обрезание вместе с положительными позициями. –

+0

@JamesPringle Я думаю, что одним из моих основных соображений при поиске «более простого» решения является то, что я скоро передам этот код преемнику. Хотя это решение является кратким, не сразу видно, почему он работает. – jameselmore

+0

Ну, вот для чего нужны комментарии в коде. –

ответ

2

Вы можете попробовать следующее. Скажем,

df <- matrix(sample(1:35,35),7,5) 
> df 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 18 16 27 19 31 
[2,] 24 1 7 12 5 
[3,] 28 35 23 4 6 
[4,] 33 3 25 26 15 
[5,] 14 10 11 21 20 
[6,] 9 2 32 17 13 
[7,] 30 8 29 22 34 

Произнесите порог 5:

apply(df,2,function(x){ x[x<5] <- max(x);which.min(x)}) 
[1] 6 7 2 2 2 

, соответствующие значениям:

[1] 9 8 7 12 5 

Это должно дать вам индекс наименьшего записи в каждом столбце больше, чем пороговое значение в соответствии с первоначальной индексацией столбцов.

+0

Жаль, что у меня было неправильное направление неравенства. Теперь исправлено «меньше» – harkmug

+0

Я заметил, что, возможно, все еще не может быть на 100% правильным. Должно ли это быть «x [x <= 5]», поскольку в результате оно возвращает 5. – jameselmore

+0

Это возвращает записи из каждого столбца. Есть ли способ, который упрощает его даже для рассмотрения только записей в одной строке? – jameselmore

4

Ответ rmk показывает основной способ получить много информации из вашей матрицы. Но если вы знаете, какой столбец вы проверяете для минимального значения (выше вашего порога), а затем хотите вернуть другое значение в этой строке, может быть что-то вроде

incol<- df[,4] # select the column to search 
outcol <- 2 # select the element of the found row you want to get 
threshold <- 5 
df[ rev(order(incol>threshold))[1] ,outcol] 
+1

Означает ли это решение, что существует хотя бы одно число, которое превышает пороговое значение? – Henrik

+0

@ Хенрик Да, я думаю, что так оно и есть, поэтому, возможно, стоит вставить 'if', чтобы убедиться, что в первую очередь нужно захватить ценность. –

Смежные вопросы