Calcolo delle percentuali in un comunicato applicare (R)
Domanda
sto lottando con qualcosa di molto semplice, ma sto andando in giro in tondo, e non vedo dove faccio un errore. Spero davvero che qualcuno mi potrebbe dare un suggerimento a portata di mano, in modo che io non sono più bloccati sono!
Il mio obiettivo: Voglio calcolare la percentuale di casi in un data.frame che hanno un risultato superiore a 0. Ho provato questo con il ciclo for, ma senza alcun risultato. Così, dopo un po 'di più alla ricerca ho usato la funzione per calcolare i vari parametri come media, deviazione standard, e min / max si applicano. Questa grande opera, ma per il calcolo della percentuale di applicare la funzione non funziona, anche quando faccio una funzione personalizzata, e inserire questo nella funzione applico.
Questa è la versione abbreviata del mio data.frame:
tradesList[c(1:5,10:15),c(1,7)]
Instrument TradeResult.Currency.
1 JPM -3
2 JPM 264
3 JPM 284
4 JPM 69
5 JPM 283
10 JPM -294
11 KFT -8
12 KFT -48
13 KFT 125
14 KFT -150
15 KFT -206
Voglio riassumere questo data.frame, ad esempio visualizzando il TradeResult media per ogni strumento:
> tapply(tradesList$TradeResult.Currency., tradesList$Instrument, mean)
JPM KFT
42.3 14.6
Comunque, mi piace anche per calcolare la percentuale di righe che hanno un TradeResult> 0 per ogni strumento. Con il 'che' la funzione di controllo per le istanze che sono> 0 funziona, tuttavia, si applicano non accetterà questa funzione come argomento.
> length(which(tradesList$TradeResult.Currency. > 0)) / length(tradesList$TradeResult.Currency.) * 100
[1] 50
> tapply(tradesList$TradeResult.Currency., tradesList$Instrument, (length(which(tradesList$TradeResult.Currency. > 0)) / length(tradesList$TradeResult.Currency.) * 100))
Error in match.fun(FUN) :
c("'(length(which(tradesList$TradeResult.Currency. > 0))/length(tradesList$TradeResult.Currency.) * ' is not a function, character or symbol", "' 100)' is not a function, character or symbol")
>
La ricerca è stata la funzione di aiuto per maggiori informazioni su questo errore, e ha cercato diversi modi di formulare la funzione (ad esempio con staffe o virgolette), ma ogni modo ha portato allo stesso risultato.
Qualcuno sa un whay per calcolare la percentuale di istanze che sono superiori a zero? Forse mi manca qualcosa?
Grazie mille in anticipo,
Saluti,
Modifica Grazie mille per i vostri commenti veloci G. Grothendieck, Gavin Simpson e Dwin. Molto apprezzato e molto utile!
Risolto: Ecco quello che ho adesso:
> tmpData <- tradesList[c(1:5,10:15),c(1,7)]
> tmpData
Instrument TradeResult.Currency.
1 JPM -3
2 JPM 264
3 JPM 284
4 JPM 69
5 JPM 283
10 JPM -294
11 KFT -8
12 KFT -48
13 KFT 125
14 KFT -150
15 KFT -206
> 100* # to get percentages
+ with( tmpData,
+ tapply( (TradeResult.Currency. > 0) , Instrument, sum)/ # number GT 0
+ tapply( TradeResult.Currency., Instrument, length) ) # total number
JPM KFT
66.66667 20.00000
> 100 * tapply(tmpData$TradeResult.Currency. > 0, tmpData$Instrument, mean)
JPM KFT
66.66667 20.00000
> pcentFun <- function(x) {
+ res <- x > 0
+ 100 * (sum(res) / length(res))
+ }
>
> with(tmpData, tapply(TradeResult.Currency., Instrument, pcentFun))
JPM KFT
66.66667 20.00000
Grazie ancora!
Saluti,
Soluzione
Scrivi una semplice funzione di fare il calcolo:
pcentFun <- function(x) {
res <- x > 0
100 * (sum(res) / length(res))
}
Quindi possiamo applicare che a gruppi di strumenti, tramite tapply()
> with(tradeList, tapply(TradeResult.Currency, Instrument, pcentFun))
JPM KFT
66.66667 20.00000
ma aggregate()
sarebbe più utile se si desidera che la sintesi con i nomi degli strumenti:
> with(tradesList, aggregate(TradeResult.Currency,
+ by = list(Instrument = Instrument), pcentFun))
Instrument x
1 JPM 66.66667
2 KFT 20.00000
Altri suggerimenti
Prova questo:
100 * tapply(tradesList$TradeResult.Currency. > 0, tradesList$Instrument, mean)
Con i dati di esempio nel post dà:
JPM KFT
66.67 20.00
e qui sta usando sqldf (nota che il driver RSQLite traduce punti di sottolineatura in quanto i punti sono anche un operatore di SQL in modo da utilizzare underscore dove puntini erano):
> library(sqldf)
> sqldf("select Instrument,
+ 100 * avg(TradeResult_Currency_ > 0) as '%>0',
+ avg(TradeResult_Currency_) as 'Avg Currency'
+ from tradesList group by Instrument")
Instrument %>0 Avg Currency
1 JPM 66.67 100.5
2 KFT 20.00 -57.4
Questi due potrebbero anche essere tradotto a aggregate
mediante opportuna modifica della soluzione aggregate
già postato.
Si può lavorare con risultati logici utilizzando somma o media per ottenere risultati significativi sintesi:
100* # to get percentages
with( tradesList,
tapply( (TradeResult.Currency. > 0) , Instrument, sum)/ # number GT 0
tapply( TradeResult.Currency., Instrument, length) ) # total number
Edit: ho notato che Gavin ti ha dato una risposta che ha restituito un dataframe, una classe generalmente ben compreso. La classe dei valori sia da Gabor di e le mie risposte erano array di una dimensione. Essi potrebbero essere trasformati in-vettori denominati circondando l'oggetto da c () che funge anche da concatenazione e coercizione per funzione vettoriale. E nella loro forma attuale sono perfettamente accettabili per rbinding o l'accesso con "[" nei modi previsti e Retrun risultati attesi dai nomi ().
restituisce la funzione Tapply array con il numero di dimensioni nell'argomento INDEX (s) e può essere molto efficace combinata per operazioni di matrice con oggetti tabella. Faccio un sacco di dividere somme dai conti, o conteggi da somme per ottenere statistiche di categoria significative in 2, 3 o 4 dimensioni.