私は次のことを成し遂げるのに苦労しています:
データセットの例:
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'