2013-08-28 13 views
5

Ho un dato (chiamiamolo mydata) con il seguente frame di dati.Come si lavora con l'ordine con la funzione R "per"?

datetime|side(0=Bid,1=Ask)| distance(1:best price, 2: 2nd best, etc.)| price 
2008/01/28,09:11:28.000,0,1,1.6066 
2008/01/28,09:11:28.000,0,2,1.6065 
2008/01/28,09:11:28.000,0,3,1.6064 
2008/01/28,09:11:28.000,0,4,1.6063 
2008/01/28,09:11:28.000,0,5,1.6062 

2008/01/28,09:11:28.000,1,1,1.6067 
2008/01/28,09:11:28.000,1,2,1.6068 
2008/01/28,09:11:28.000,1,3,1.6069 
2008/01/28,09:11:28.000,1,4,1.6070 
2008/01/28,09:11:28.000,1,5,1.6071 

voglio calcolare minAsk-maxBid, in questo caso = 1,6067-1,6066. Voglio farlo per tutti i miei dati. Stavo pensando utilizzando "con", ma anche utilizzando questo semplice codice:

by(mydata,mydata$datetime, min(mydata$price)) 

per trovare solo il prezzo minimo in ogni blocco ottengo il seguente errore: Errore nel divertimento (X [[1L]], ...): impossibile trovare la funzione "FUN"

Qualche idea su come implementarlo? Devo usare una diversa funzione ddply forse?

+1

Se hai "distanza" non si ha realmente bisogno min/max; potresti semplicemente impostare sottoinsieme per includere solo 'distance == 1'. Infatti, se i tuoi dati sono puliti e lo spread non viene mai superato, puoi semplicemente prendere il valore "abs" della differenza tra i prezzi dove la distanza == 1 per ogni volta. – GSee

+0

Otterrete le risposte migliori se rendete i vostri dati riproducibili. In questo caso, se hai appena fornito l'output di 'dput (mydata)' nella tua domanda, otterresti risposte migliori. Nota che ciò che hai mostrato ha colonne separate per Data e ora, ma dovresti davvero usare una singola colonna datetime (probabilmente POSIXct). – GSee

+0

@ GSee- Ho avuto i miei dati in colonne. Vado con la soluzione nella seconda risposta poiché l'impostazione secondaria in un enorme dato non è efficiente. Grazie per i punti sulla pubblicazione di maggiori informazioni, sono nuovo qui e lo farò da quella volta. – mitra

risposta

3

Si stanno dando la by sbagliate input richiesti. Hai bisogno di qualcosa di simile:

by(mydata,mydata$datetime, function(x) min(x$price)) 
#mydata$datetime: 2008/01/28,09:11:28.000 
#[1] 1.6062 

Vedi ?by - esso è la cosa più fondamentale by prende gli ingressi di ...

by(data, INDICES, FUN) 

La funzione FUN viene applicato a un intero sottoinsieme del data.frame specificato come data. Cioè se si utilizza identity come funzione FUN, verrà restituito ogni sottoinsieme definito da INDICES. Prova:

by(mydata,mydata$datetime, identity) 

Pertanto, non si può semplicemente chiedere la min(mydata$price) direttamente, è necessario chiedere il min della variabile price all'interno del sottoinsieme. Si potrebbe scrivere il mio longhand risposta originale come ...

by(mydata,mydata$datetime, function(subdataset) min(subdataset$price)) 

Per espandere questo al vostro problema completo, si può fare qualcosa di simile:

by(
    mydata, 
    mydata$datetime, 
    function(x) min(x$price[x$side==1]) - max(x$price[x$side==0]) 
) 
#mydata$datetime: 2008/01/28,09:11:28.000 
#[1] 1e-04 

Per riferimento futuro, questo è molto simile in teoria il modo in cui il pacchetto funziona con l'argomento by= e il suo codice .SD (sotto-dati). Un data.table risposta in questo caso è ancora più semplice se:

mydt <- as.data.table(mydata) 

mydt[,min(price[side==1]) - max(price[side==0]),by=datetime] 
#     datetime V1 
#1: 2008/01/28,09:11:28.000 1e-04 

mydt[,list(minmax=min(price[side==1]) - max(price[side==0])),by=datetime] 
#     datetime minmax 
#1: 2008/01/28,09:11:28.000 1e-04 
+2

l'approccio 'data.table' non richiede' .SD'.'mydt [, min (price), by = datetime]' è sufficiente e preferito – mnel

+0

@mnel - dannazione, hai ragione - che indebolisce la mia analogia tra 'by' e' .SD' però ;-) – thelatemail

+0

grandi punti, Ho usato data.table, non avevo idea che fosse diverso. perché non funziona allora: mydt [, (min (price [side == 1]) - max (price [side == 0])) di = datetime] – mitra

4

Prova

by(mydata,mydata$datetime, function(d)with(d, min(price[side==1])-max(price[side==0]))) 
Problemi correlati