2017-11-02 9 views
1

비공개 조인과 함께 다음을 수행 할 수 있어야한다고 생각하지만 작동하도록 관리 할 수는 없습니다. 이 질문에 대한 연장의 종류 나는 몇 주 전에 물었다 : Fast way to find min in groups after excluding observations using R.데이터 테이블을 사용하여 행 특정 기준을 충족하는 행에 대해 min을 찾으십시오.

데이터 세트가 있습니다. 점수가 컷오프보다 높으면 인정됩니다. 이제 어느 애플리케이션이 엄격하게 지배되고 있는지 파악하고 싶습니다. 나는. 누군가가 다른 선택보다 더 낮은 마진을 가진 선택을 우선시했을 때 그 선택에 결코 들어갈 수 없을 때.

e.e. 특정 행에있는 cutoff을 더 낮은 우선 순위 번호를 가진 동일한 그룹의 모든 행과 비교할 때 더 낮은 우선 순위 (낮은 우선 순위) 선택이 낮은 경우에는 dominated = TRUE로 설정하십시오.

다음 코드는 작동하지만 무척 느린 : 예, 그것은 비 동등 수행 할 수 있습니다

library(data.table) 
dt <- data.table(prio = c(c(1,2,4,5,6,7,8), c(1,2,4,5), c(1,2,4,5,6,7,8), c(1,2,4,10,13)), 
       c = c(c(20,16,19,20,21,11,22), c(1.5, 1.3, 1.7, 1.2), c(20,16,19,20,21,11,22), c(123,332,121,334,335)), 
       admission_group = c(rep("X", 7), rep("Y", 4), rep("X", 7), rep("Z", 5)), 
       individual = c(rep("A", 11), rep("B", 12)), 
       dominated = rep(FALSE, 23)) 

dt[, 
    min_c_lower_prio := 
     unname(sapply(split(outer(prio,prio, "<="), 
          rep(1:length(prio), 
           each = length(prio))), 
         FUN = function(x) min(c[x], na.rm = TRUE))), 
    by = .(admission_group, individual) 
] 

dt[c > min_c_lower_prio, dominated := TRUE] 

답변

3

조인 종류의 우선 순위,

dt[, d := dt[.SD, on=.(admission_group, individual, prio < prio, c < c), mult="first", 
    .N > 0, by=.EACHI]$V1] 

교대를하고 cummin를 사용

dt[order(prio), d2 := c > cummin(c), by=.(admission_group, individual)] 
+1

고마워요! cummin을 사용하는 것이 실제로 훨씬 더 간단합니다. 큰! – adamski