2013-12-08 5 views
1

for 루프와 함께 작동하는 R 루틴이 있는데 "적용"으로 변환하는 확실한 후보로 보이지만 적절한 함수를 작성하는 방법을 알 수는 없습니다 동일한 인덱스를 사용하여 병렬로 작업하는 두 행렬의 행/열이 필요합니다.R 행렬 및 선택기로 함수 적용

이 함수는 동일한 크기의 두 행렬을 사용합니다. 두 번째 버전은 첫 번째 버전의 반올림되고 잘린 버전입니다. "margin"값 에 따라 행 또는 열로 반올림 및 반올림 된 행렬간에 최소 및 최대 차이 의 사용자 지정 버전을 반환합니다. 반올림 된 값이 잘리는 셀은 최소/최대 계산시 무시되므로 적절한 값을 제공하는 각 함수의 선택기를 계산합니다.

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) 
} 
이 루틴 작동하지만

, 그것은 내가 사용 행렬의 크기에 적절한 시간에 실행, 나는 "적용"을보다 효율적으로 할 수 있는지 알고 싶습니다. 특히 인덱스 된 변수의 행/열에 대해 명시 적으로 코드를 작성하지 않아도됩니다. 이 기능을 "적용"할 수있는 것처럼 임의의 수의 차원으로 확장 할 수 있으면 좋을 것입니다.

일부 테스트 데이터 : 그것은 상단에 논리적 물건 아니었다면

U <- matrix(c(-0.825, -0.031, 1.398, 3.148, 4.604, 
       0.662, 1.457, 2.886, 4.636, 6.091, 
       2.487, 3.281, 4.710, 6.460, 7.916, 
       4.513, 5.308, 6.737, 8.487, 9.942, 
       6.758, 7.553, 8.982, 10.732, 12.187), nrow=5) 

R <- matrix(c(0, 0, 1, 3, 5, 1, 1, 3, 5, 6, 2, 3, 5, 6, 8, 
       5, 5, 7, 8, 10, 7, 8, 9, 11, 12), nrow=5) 

diff.minmax(U, R, 1) 

     [,1] [,2] 
[1,] -0.487 0.487 
[2,] -0.457 0.447 
[3,] -0.398 0.290 
[4,] -0.487 0.364 
[5,] -0.187 0.396 

diff.minmax(U, R, 2) 
     [,1] [,2] 
[1,] -0.398 0.396 
[2,] -0.457 0.364 
[3,] -0.487 0.290 
[4,] -0.487 0.487 
[5,] -0.187 0.447 

답변

3

, 나는 말할 것입니다,

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

더 큰 데이터 세트에서 이것을 시도하면 버전의 성능이 거의 7 배 향상됩니다. 많은 감사합니다. –