私は次のことを成し遂げるのに苦労しています:
データセットの例:
   belongID   uniqID   Time   Rating  
   1           101       5      0  
   1           102       4      0  
   2           103       4      0  
   2           104       3      0  
   2           105       2      5
   3           106       4      2  
   3           107       5      0  
   3           108       5      1 
問題は、この評価が 0 でない限り、所属 ID ごとに最新のエントリ (時間の最大値) を抽出したいということです。ただし、最新のエントリの評価が 0 の場合。評価のある最初のエントリが必要です (最高の評価ではなく、評価がゼロではない最初の値のみ)。他のすべてのエントリもゼロの場合は、最新のものを選択する必要があります。
最終結果は次のようになります。
   belongID   uniqID   Time   Rating  
   1           101       5      0  
   2           105       2      5
   3           108       5      1  
データセットはかなり大きく、所属 ID で並べられています。時間順に並べられていないため、同じ所属 ID を持つ古いエントリの後に新しいエントリが来る場合があります。
「0 評価」制約を使用せずに、次の関数を使用して最新のエントリを計算しました。
>uniqueMax <- function(m, belongID = 1, time = 3) {
    t(
      vapply(
         split(1:nrow(m), m[,belongID]), 
         function(i, x, time) x[i, , drop=FALSE][which.max(x[i,time]),], m[1,], x=m, time=time
      )
    )
 }
「0 評価」制約を組み込む方法がわかりません。
編集:フォローアップの質問:
getRatingゼロを評価するだけでなく、より多くの評価を考慮する必要がある場合 (たとえば、0、1、4、および 5) 、関数をどのように変更する必要があるかを誰かが知っていますか? したがって、レーティング 0 または 1 または 4 または 5 でない限り、最新のものに割り当てますか? 評価が 0、1、4、5 の場合、別の評価を持つ最新のエントリに割り当てます。すべての評価が 0、1、4、または 5 の場合、最新のものに割り当てます。次のことを試しましたが、うまくいきませんでした:
getRating <- function(x){
  iszero <- x$Rating == 0 | x$Rating == 1 | x$Rating == 4 | x$Rating ==5
  if(all(iszero)){
    id <- which.max(x$Time)
  } else {
    id <- which.max((!iszero)*x$Time) 
            # This trick guarantees taking 0 into account
  }
  x[id,]
}
# Do this over the complete data frame
do.call(rbind,lapply(split(Data,Data$belongID),getRating)) 
     # edited per Tyler's suggestion'
