2012-05-12 58 views
1

對於模糊的問題標題,我找不出更具體的東西。R索引問題

我有3×2矩陣c

> c 
    [,1] [,2] 
[1,] 1 2 
[2,] 1 3 
[3,] 2 3 

這是ncol(c) == 2重要。

我也有矩陣ind

> ind 
     [,1] [2] [,3] [,4] 
[1,] 2 2 2 1 
[2,] 1 1 2 2 
[3,] 2 2 2 1 

nrow(c) == nrow(ind),而矩陣ind的值是1和2(比如列索引對C的每一行)

是很重要的就是我想要得到的是矩陣a具有相同的灰暗ind這樣a[i,j] == c[i,ind[i,j]]

> a 
     [,1] [2] [,3] [,4] 
[1,] 2 2 2 1 
[2,] 1 1 3 3 
[3,] 3 3 3 2 

我可以做的不夠全面的情況類似,例如東西,如果nrow(c) == 1我將使用apply

> apply(c,2,function(x){return(matrix(x[ind], nrow(ind)))}) 

我知道有一種方法,通過使用mapply 2只列出了迭代,但

1)我不知道什麼是最好的方式來表示行列表 2)我想這個解決方案醜陋

什麼是最好的方式來實現我在這裏descibed?

+0

你想初始化或檢查布爾條件'a [i,j] == c [i,ind [i,j]]' – Subs

+0

不知道你是什麼意思?我的意思是,這個條件對任何我和j來說都是正確的。但我不知道如何寫在很好的矢量化的形式。這個想法是在這個線程 –

+0

問題好吧,你用了2等於,但現在我知道你想用該等式初始化它 – Subs

回答

4

矩陣索引到救援!

> c.mat <- matrix(c(1,1,2,2,3,3), ncol=2) 
> ind <- matrix(c(2,1,2,2,1,2,2,2,2,1,2,1), ncol=4) 
> matrix(c.mat[cbind(as.vector(row(ind)), as.vector(ind))], ncol=ncol(ind)) 
    [,1] [,2] [,3] [,4] 
[1,] 2 2 2 1 
[2,] 1 1 3 3 
[3,] 3 3 3 2 
+0

謝謝,多好的解決方案! –

0
f<-function(x,row1){ 
    for(i in 1:length(x)){ 
    x[i]=cc[i,ind[i,row1]] 
    } 
    x 
} 
a=apply(cc,1,f,nrow(a)) 

您可以使用應用這樣的。注意:cc是你的c matrix