R索引问题

R索引问题,r,indexing,vectorization,R,Indexing,Vectorization,对不起,问题的标题含糊不清,我想不出更具体的问题了 我有3x2矩阵c: 重要的是,ncolc==2 我还有矩阵ind: 重要的是,nrowc==nrowind,矩阵ind的值是c的每一行的1和2个类似的列索引 我想要得到的是矩阵a,其dim与ind相同,因此a[i,j]==c[i,ind[i,j]]: 我可以在不太全面的情况下做类似的事情,例如,如果nrowc==1,我将使用apply: 我知道有一种方法可以使用mapply通过两个列表进行迭代,但是 1我不知道用行列表表示矩阵的最佳方法是什么

对不起,问题的标题含糊不清,我想不出更具体的问题了

我有3x2矩阵c:

重要的是,ncolc==2

我还有矩阵ind:

重要的是,nrowc==nrowind,矩阵ind的值是c的每一行的1和2个类似的列索引

我想要得到的是矩阵a,其dim与ind相同,因此a[i,j]==c[i,ind[i,j]]:

我可以在不太全面的情况下做类似的事情,例如,如果nrowc==1,我将使用apply:

我知道有一种方法可以使用mapply通过两个列表进行迭代,但是

1我不知道用行列表表示矩阵的最佳方法是什么 我觉得这个解决方案很难看


实现我在这里描述的目标的最佳方法是什么?

矩阵索引拯救

> 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

矩阵索引到救援

> 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
你可以这样申请。注意:cc是您的c矩阵


你可以这样申请。注意:cc是你的c矩阵

你想初始化或检查布尔条件a[i,j]==c[i,ind[i,j]]不确定你的意思是什么?我的意思是,条件对任何i和j都是真的。但我不知道如何用漂亮的矢量化形式来写。Ided是这个threadwell中的问题,你使用了2等于,但现在我知道你想用这个等式初始化它啊,这不像是一个正确的R语句或什么的。我只是说我希望得到一个这样的条件,即条件为真。警告:永远不要使用c作为对象名。您将与cstuff发生冲突,并使这位老人感到困惑。是否要初始化或检查布尔条件a[i,j]==c[i,ind[i,j]]不确定您的意思是什么?我的意思是,条件对任何i和j都是真的。但我不知道如何用漂亮的矢量化形式来写。Ided是这个threadwell中的问题,你使用了2等于,但现在我知道你想用这个等式初始化它啊,这不像是一个正确的R语句或什么的。我只是说我希望得到一个这样的条件,即条件为真。警告:永远不要使用c作为对象名。你会和cstuff发生冲突,也会把这位老人弄糊涂。谢谢,这是一个多么好的解决方案!谢谢,多好的解决方案啊!
> a
      [,1] [2] [,3] [,4]
[1,]    2    2    2    1
[2,]    1    1    3    3
[3,]    3    3    3    2
 > apply(c,2,function(x){return(matrix(x[ind], nrow(ind)))})
> 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
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))