2017-11-02 8 views
1

非等価結合では次のことが可能であるが、それを機能させることはできないと考えている。この質問への拡張の並べ替え私は数週間前に尋ねた:Fast way to find min in groups after excluding observations using Rデータテーブルを使用して、行固有の条件を満たす行をグループ内で検索する

私はアプリケーションのデータセットを持っています。スコアがカットオフを上回る場合、あなたは認められます。今、どのアプリケーションが厳しく支配されているのかを特定したいと思います。私。誰かが別の選択肢よりも低いマージンを持つ選択肢を優先順位付けし、その選択肢に決して入らないときは、

I.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

関連する問題