2013-08-12 7 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

이 솔루션은 incol에서 임계 값보다 큰 하나 이상의 숫자가 있다고 가정합니까? – Henrik

+0

@Henrik 그래, 그렇게 생각한다. 그래서 처음부터 잡힐만한 가치가 있는지 확인하기 위해 'if'를 넣을 가치가있을 것이다. –

관련 문제