2017-08-05 25 views
3

我想從表中提取一些信息,並且我試圖避免任何對於循環或應用類型的函數。使用ifelse從矩陣中提取信息

假設一個矢量米

m=c(1:20) 
m 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

和基質克

x1=c(0,1,0,1,2,0,1,2,3,0,1,2,3,4,0,1,2,3,4,5) 
x2=c(1,0,2,1,0,3,2,1,0,4,3,2,1,0,5,4,3,2,1,0) 
u=.4*x1^.5+.6*x2^.5 
g=cbind(x1,x2,u) 
g 
     x1 x2   u 
[1,] 0 1 0.6000000 
[2,] 1 0 0.4000000 
[3,] 0 2 0.8485281 
[4,] 1 1 1.0000000  
[5,] 2 0 0.5656854 
[6,] 0 3 1.0392305 
[7,] 1 2 1.2485281 
[8,] 2 1 1.1656854 
[9,] 3 0 0.6928203 
[10,] 0 4 1.2000000 
[11,] 1 3 1.4392305 
[12,] 2 2 1.4142136 
[13,] 3 1 1.2928203 
[14,] 4 0 0.8000000 
[15,] 0 5 1.3416408 
[16,] 1 4 1.6000000 
[17,] 2 3 1.6049159 
[18,] 3 2 1.5413485 
[19,] 4 1 1.4000000 
[20,] 5 0 0.8944272 

我想對於m的每個元素,以檢查和G [1] + G [2]等於那個元素。對於條件爲TRUE的所有情況,我希望我的代碼返回具有最高值g [,3]的那個位置。 例如,當m = 5時,條件x [,1] + x [,2] == 5在15,16,17,18,19和20處爲TRUE。在此6中,條目17具有最高值,所以我想我的代碼返回值17.

所以最後,我會期待一個長度=長度(m)的向量,這將指示m的每個元素,其中g是最大值[,3]滿足上述條件。載體應是這樣的:

1,4,7,11,17,0,0,0,0,0,0...,0 

其中當m = 1時,行其中g [1] + G [2] == 1是行1 當m = 2時,行其中g [,1] + g [,2] == 2是第4行,依此類推。

目前我正在使用在g的每一行上應用,但是這個過程重複了上千次,而且我的代碼很慢。爲了加快速度,我採取了ifelse努力以矢量化的方式做事。

我所試圖做的是以下幾點:

ifelse(m>0,which(g[,3]==max(g[which(g[,1]+g[,2]==m),3])),0) 

當我運行此我得到

[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

而如果我用5代男,返回17S的矢量。 它似乎只使用m的第一個元素而不是整個矢量。 任何關於我如何做這項工作的建議,或者可以做同樣工作的替代方案都是值得歡迎的。

+0

u能顯示預期的輸出?試試'which(outer(m,g [,1] + g [,2],'=='),arr.ind = TRUE)'或者可能是'g [,3] [max.col(outer(m ,g [,1] + g [,2],'=='))]' – akrun

+0

謝謝。我編輯了問題以包含預期的輸出。 – KGeor

回答

2

我們可以使用outermax.col

m1 <- t(outer(g[,1] + g[,2], m, `==`)* g[,3]) 
max.col(m1) * (rowSums(m1!= 0) !=0) 
#[1] 1 4 7 11 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+1

這樣做的工作!非常感謝! – KGeor