jestem stara się uzyskać następujące zrobić:Extract Najnowszy wpis, pod pewnym warunkiem
Przykład zbioru danych:
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
Problemem jest: chciałbym wyodrębnić Najnowszy wpis (największa wartość dla czasu) na belongsID, chyba że ta ocena to 0. Jeśli ocena najnowszego wpisu wynosi 0 jednak. Chcę pierwszy wpis z ratingiem (nie najwyższą oceną, tylko pierwsza wartość z ratingiem, który nie wynosi zero). Jeśli wszystkie inne wpisy są równe zero, należy wybrać najnowszą.
Wynik końcowy powinien być niż:
belongID uniqID Time Rating
1 101 5 0
2 105 2 5
3 108 5 1
Zbiór danych jest dość duży i jest sortowana według belongID. Nie jest ono uporządkowane według czasu, więc nowsze wpisy mogą pochodzić z starszych wpisów o tym samym należącym identyfikatorze.
Bez konieczności „0 rating” ograniczenie, kiedyś następującą funkcję do obliczania najnowszy wpis:
>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
)
)
}
nie wiem jak włączyć się „0 rating” ograniczenie.
EDIT: kontynuacją pytanie:
Czy ktoś wie jak funkcja getRating
powinny być zmienione, jeśli nie tylko ocena zera, ale więcej ocen muszą być brane pod uwagę (na przykład 0,1,4 i 5)? W ten sposób przypisać do najnowszych, chyba że Ocena 0 lub 1 lub 4 lub 5? Jeśli Ocena wynosi 0,1,4,5, przypisz do najnowszego wpisu z inną oceną. Jeśli wszystkie oceny wynoszą 0,1,4 lub 5, przypisz je do ostatnich. Próbowałem następujących, ale to nie działa:
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'
właśnie widział tę odpowiedź, ładny +1. Powinien być szybszy niż przyjęta odpowiedź, o której myślałem. Btw, zamiast 'data [kolejność (-czasowa)] [1]', 'data [kolejność (-czasowa) [1]]' powinna być znacznie szybsza. Pierwszy sposób zmienia kolejność wszystkich kolumn, a następnie przyjmuje pierwszy wiersz tego. Drugi sposób znajduje potrzebny wiersz i po prostu go bierze. Im więcej kolumn, tym szybciej powinna być druga droga. –