R:使用行特定的断点应用切割

use*_*481 5 r matrix apply

我想将潜在分数矩阵转换为观察分数.

人们可以通过将断点/阈值应用于原始矩阵来实现,从而最终得到一个新的分类矩阵.这样做很简单,例如:

#latent variable matrix
true=matrix(c(1.45,2.45,3.45,
              0.45,1.45,2.45,
              3.45,4.45,5.45)
,ncol=3,byrow=TRUE)

#breaks for the cut function
br=c(-Inf,1,2,3,4,Inf)

#apply cut function to latent variable
observed=apply(true,c(1,2),cut,breaks=br,labels=FALSE,include.lowest=TRUE)
Run Code Online (Sandbox Code Playgroud)

但是,我需要做的是对原始矩阵的每一行应用不同的中断.这些阈值存储在矩阵中:

#matrix of breaks for the cut function
br=matrix(c(-Inf,1,2,3,4,Inf,
             -Inf,1.5,2.5,3.5,4.5,Inf,
             -Inf,2,3,4,5,Inf)
,ncol=6,byrow=TRUE)
Run Code Online (Sandbox Code Playgroud)

也就是说,第1行的BR矩阵应作为中断了的第1行真正的矩阵和该行只,排2 BR是第2行的符真实,等等.

使用以下似乎没有做的工作:

for (i in 1:nrow(true)) {
  observed[i,]=apply(true[i,],c(1,2),cut,breaks=br[i,],labels=FALSE,include.lowest=TRUE)
}
Run Code Online (Sandbox Code Playgroud)

你有什么想法?有没有办法将相应的br线应用于相应的真实线并将其保存在观察到的相同线上?

提前谢谢了!

KH

csg*_*pie 1

使用sapply超过行数(本质上只是隐藏 for 循环)可以给你你想要的:

values = sapply(1:nrow(true), function(i) 
     cut(true[i,], br[i,], labels=FALSE, include.lowest=TRUE)))
values = t(values)
Run Code Online (Sandbox Code Playgroud)

不幸的是,我们需要额外的转置步骤才能以正确的方式获得矩阵。


关于问题中的 for 循环,当您只对一行进行子集化时,即true[i,]我们只得到一个向量。这会导致apply损坏。为了避免向量,你需要一个额外的参数

true[i,, drop=FALSE]
Run Code Online (Sandbox Code Playgroud)