【问题标题】:R: Apply cut using row-specific breaksR:使用特定行的中断应用剪切
【发布时间】:2015-01-29 13:46:15
【问题描述】:

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

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

#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)

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

#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)

也就是说,br 矩阵的第 1 行应该作为 true 矩阵第 1 行的中断并且仅用于该行 , br 的第 2 行是 true 的第 2 行的换行符,以此类推

使用以下似乎不起作用:

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

你有什么想法吗?有什么方法可以将各自的 br 行应用到各自的真实行并将其保存在同一观察行中?

非常感谢!

KH

【问题讨论】:

    标签: r matrix apply


    【解决方案1】:

    在行数上使用sapply,(基本上只是隐藏for循环)给你你想要的:

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

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


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

    true[i,, drop=FALSE]
    

    【讨论】:

    • 也感谢您的回答!运行速度也很快。
    【解决方案2】:

    一些函数式编程和Map 可以解决问题:

    splitLines = function(m) split(m, rep(1:nrow(m), ncol(m)))
    
    do.call(rbind, Map(cut, splitLines(true), splitLines(br), labels=F, include.lowest=T))
    #  [,1] [,2] [,3]
    #1    2    3    4
    #2    1    1    2
    #3    3    4    5
    

    【讨论】:

    • 我发现您的问题对 Map 来说是一个奇迹!或者地图是这类问题的奇迹!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多