Sto provando a creare una funzione finestra con dplyr, che restituirà un nuovo vettore con la differenza tra ogni valore e il primo del suo gruppo. Ad esempio, dato questo insieme di dati:differenza dal primo nel gruppo con dplyr
dummy <- data.frame(userId=rep(1,6),
libId=rep(999,6),
curatorId=c(1:2,1:2,1:2),
iterationNum=c(0,0,1,1,2,2),
rf=c(5,10,0,15,30,40)
)
che crea questo insieme di dati:
userId libId curatorId iterationNum rf
1 1 999 1 0 5
2 1 999 2 0 10
3 1 999 1 1 0
4 1 999 2 1 15
5 1 999 1 2 30
6 1 999 2 2 40
E dato questo raggruppamento:
dummy<-group_by(dummy,libId,userId,curatorId)
diventa Questo risultato:
userId libId curatorId iterationNum rf rf.diff
1 1 999 1 0 5 0
2 1 999 2 0 10 0
3 1 999 1 1 0 -5
4 1 999 2 1 15 -5
5 1 999 1 2 30 25
6 1 999 2 2 40 30
Quindi per ogni gruppo di utenti, lib e curatori, otterrei il valore rf, meno il valore rf con iterationNum = 0. Ho provato a giocare con la funzione first
, la funzione rank
e altre, ma non ho trovato il modo di inchiodarla.
--- EDIT ---
Questo è quello che ho provato:
dummy %>%
group_by(userId,libId,curatorId) %>%
mutate(rf.diff = rf - subset(dummy,iterationNum==0)[['rf']])
E:
dummy %>%
group_by(userId,libId,curatorId) %>%
mutate(rf.diff = rf - first(x = rf,order_by=iterationNum))
Quali blocca R e restituisce questo messaggio di errore:
pure virtual method called terminate called after throwing an instance of 'Rcpp::exception' what(): incompatible size (%d), expecting %d (the group size) or 1`
Sembra che tu sappia già tutte le funzioni necessarie per farlo. Puoi mostrare cosa hai provato e cosa non ha funzionato come previsto? Forse hai solo bisogno di organizzare (ordinare) i tuoi dati prima di calcolare le differenze. –
Eri vicino. Usa invece 'rf - rf [iterationNum == 0]' all'interno del mutato. L'altra opzione è di organizzare i dati usando 'arrange (iterationNum)' come un passo separato nella pipe e l'uso 'rf - first (rf)' nel mutate se sei sicuro che ogni gruppo ha uno 0 in rf e no valori inferiori. –
'rf - first (rf, iterationNum)' – hadley