R应用带有矩阵和选择器的函数

R应用带有矩阵和选择器的函数,r,apply,R,Apply,我有一个与for循环一起工作的R例程,它显然是转换为“apply”的候选者,但我不知道如何编写适当的函数,因为它需要来自两个矩阵的行/列,同时使用相同的索引 该函数采用两个大小相同的矩阵。第二个是第一个的圆角和截断版本。它返回最小和最大差异的自定义版本 在舍入矩阵和未舍入矩阵之间,按行或按列,具体取决于值 “保证金”的定义。在计算最小值/最大值时,舍入值被截断的单元格将被忽略,因此我为每个函数计算选择器,以获得适当的值 diff.minmax <- function(unrounded,

我有一个与for循环一起工作的R例程,它显然是转换为“apply”的候选者,但我不知道如何编写适当的函数,因为它需要来自两个矩阵的行/列,同时使用相同的索引

该函数采用两个大小相同的矩阵。第二个是第一个的圆角和截断版本。它返回最小和最大差异的自定义版本 在舍入矩阵和未舍入矩阵之间,按行或按列,具体取决于值 “保证金”的定义。在计算最小值/最大值时,舍入值被截断的单元格将被忽略,因此我为每个函数计算选择器,以获得适当的值

diff.minmax <- function(unrounded, rounded, margin, min.threshold=0, max.threshold=100, rounding=0) {
  diff <- rounded - unrounded
  min.sel <- rounded < max.threshold | (unrounded >= max.threshold & round(unrounded,rounding) < max.threshold)
  max.sel <- rounded > min.threshold | (unrounded <= min.threshold & round(unrounded,rounding) > min.threshold)
  len <- dim(diff)[margin]
  mm <- matrix(0, nrow=len, ncol=2)
  for (i in 1:len) {
    if (margin == 1) {
      # min/max values by row
      mm[i,1] <- min(diff[i,min.sel[i,]])
      mm[i,2] <- max(diff[i,max.sel[i,]])
    }
    else {
      # min/max values by column
      mm[i,1] <- min(diff[min.sel[,i],i])
      mm[i,2] <- max(diff[max.sel[,i],i])
    }
  }
  return(mm)
}

diff.minmax如果不是顶部的逻辑内容,我会说

apply(diff, margin, range)
但这将通过设置您不想要的Inf来实现您想要的:

function(unrounded, rounded, margin, min.threshold=0, max.threshold=100, rounding=0) {
  diff <- rounded - unrounded
  min.sel <- rounded < max.threshold | (unrounded >= max.threshold & round(unrounded,rounding) < max.threshold)
  max.sel <- rounded > min.threshold | (unrounded <= min.threshold & round(unrounded,rounding) > min.threshold)
  len <- dim(diff)[margin]
  mm <- matrix(0, nrow=len, ncol=2)

  mm[,1] <- apply( diff + ifelse(min.sel, 0, Inf), margin, min)
  mm[,2] <- apply( diff + ifelse(max.sel, 0, -Inf), margin, max)

  return(mm)
}
函数(未舍入、舍入、边距、最小阈值=0、最大阈值=100、舍入=0){

在一个更大的数据集上进行测试,您的版本的性能提高了近7倍。非常感谢。
function(unrounded, rounded, margin, min.threshold=0, max.threshold=100, rounding=0) {
  diff <- rounded - unrounded
  min.sel <- rounded < max.threshold | (unrounded >= max.threshold & round(unrounded,rounding) < max.threshold)
  max.sel <- rounded > min.threshold | (unrounded <= min.threshold & round(unrounded,rounding) > min.threshold)
  len <- dim(diff)[margin]
  mm <- matrix(0, nrow=len, ncol=2)

  mm[,1] <- apply( diff + ifelse(min.sel, 0, Inf), margin, min)
  mm[,2] <- apply( diff + ifelse(max.sel, 0, -Inf), margin, max)

  return(mm)
}