Cercando di convertire la seguente R data.frame:Dplyr windowing condizionale
structure(list(Time=c("09:30:01" ,"09:30:29" ,"09:35:56", "09:37:17" ,"09:37:21" ,"09:37:28" ,"09:37:35" ,"09:37:51" ,"09:42:11" ,"10:00:31"),
Price=c(1,2,3,4,5,6,7,8,9,10),
Volume=c(100,200,300,100,200,300,100,200,600,100)),
.Names = c("Time", "Price", "Volume"),
row.names = c(NA,10L),
class = "data.frame")
Time Price Volume
1 09:30:01 1 100
2 09:30:29 2 200
3 09:35:56 3 300
4 09:37:17 4 100
5 09:37:21 5 200
6 09:37:28 6 300
7 09:37:35 7 100
8 09:37:51 8 200
9 09:42:11 9 600
10 10:00:31 10 100
in questo
Time Price Volume Bin
1 09:30:01 1 100 1
2 09:30:29 2 200 1
3 09:35:56 3 200 1
4 09:35:56 3 100 2
5 09:37:17 4 100 2
6 09:37:21 5 200 2
7 09:37:28 6 100 2
8 09:37:28 6 200 3
9 09:37:35 7 100 3
10 09:37:51 8 200 3
11 09:42:11 9 500 4
12 09:42:11 9 100 5
13 10:00:31 10 100 5
sostanza, si calcola somme cumulative sul volume e categorizzazione eachtime 500 viene violata. Quindi, bin 1 è 100 + 200 + 200 con il volume alle 09:35:56 diviso in 200/100 e una nuova riga inserita e il contatore bin incrementato.
Questo è relativamente semplice con la base R ma mi chiedevo se ci fosse un modo più elegante e, auspicabilmente, più veloce con dplyr.
Acclamazioni
Aggiornamento:
Grazie @Frank e @AntoniosK.
Per rispondere alla domanda, l'intervallo dei valori di volume è tutti valori di interi positivi compresi tra 1 e 10k.
I microbenchmarked entrambi gli approcci e dplyr era leggermente più veloce ma non molto in esso, su un dataset simile a quello precedente con ~ 200k righe.
davvero apprezzare le risposte rapide e assistenza
Forse dovresti mostrare il modo "relativamente semplice" che hai provato. Immagino che non ci sia un approccio dplyr elegante, ma ci possono essere margini di miglioramento nella virata R di base. – Frank
Hai sempre dei valori come 100.200, ecc.? O questo è un caso semplificato? – AntoniosK
Dai un'occhiata a http://stackoverflow.com/questions/15466880/cumulative-sum-until-maximum-reached-then-repeat-from-zero-in-the-next-row –