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,

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top