2012-05-28 19 views
12

如果我有一個載體,我可以得到1號發生這低於值:獲得一個值的第一次出現的索引以矩陣的每個列

test <- c(0.5,0.8,0.1,0.08,0.06,0.04) 
which(test<0.1)[1]  

其正確給出了答案爲4 。但是,我怎麼得到一個矩陣,每一列中第一次出現,如弗斯特出現低於5在以下2列矩陣:

test2 <- matrix(c(5,8,3,4,7,5,6,2),ncol=2) 

使用applywhich返回一個列表:

> apply(test2<5,2,which) 
[[1]] 
[1] 3 4 

[[2]] 
[1] 4 

同時使用applywhich.min回報1所有列:

> apply(test2<5,2,which.min) 
[1] 1 1 

WH ereas,我想要的只是返回[1] 3 4 - 我錯過了一些明顯的東西嗎?

回答

7

這是另一個答案。假設你的意思是test2寫test3的地方,注意'test2 < 5'是一個邏輯向量。最小值將是FALSE。最大值(真)是你想要的:

> apply(test2<5,2,which.max) 
[1] 3 4 

請注意,這是不正確的,如果最大值不是TRUE。

+0

是的 - 這也行!將其應用於我的更大的結果集時,我得到與使用其他答案相同的結果 – ChrisW

5

試試這個:

test2 <- matrix(c(5,8,3,4,7,5,6,2),ncol=2) 
> test2 
    [,1] [,2] 
[1,] 5 7 
[2,] 8 5 
[3,] 3 6 
[4,] 4 2 
> foo <- function(x){which(x < 5)[1]} 
> apply(test2,2,foo) 

的關鍵在這裏是,你拿,你知道在單一載體的作品片,並簡單地包裝在一個函數。 apply將把這個函數應用於每一列。

+0

謝謝 - 我應該已經能夠工作了這一點通過自己真的!當你看到答案時很容易... – ChrisW

4

因爲我只是偶然發現了這一點,這裏是另一種解決方案:

max.col(t(test2 < 5), "first") 
0

正如馬修指出,which.max不返回正確的值,如果有一列沒有值< 5(它返回1,而正確的值是「無」)。該match功能是很好的處理這種情況:

> test2 <- matrix(c(5,8,3,4, 7,5,6,7), ncol=2) 
> apply(test2<5, 2, which.max) 
[1] 3 1 
> apply(test2<5, 2, function(x) match(TRUE, x)) 
[1] 3 NA 
相關問題