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