Domanda

Ho i dati del traffico di rete nel seguente per ogni ora di un periodo di dieci giorni come segue in un set di dati r.

   Day   Hour         Volume          Category
    0    00            100            P2P
    0    00            50             email
    0    00            200            gaming
    0    00            200            video
    0    00            150            web
    0    00            120            P2P
    0    00            180            web
    0    00            80             email
    ....
    0    01            150            P2P
    0    01            200            P2P
    0    01             50            Web
    ...
    ...
    10   23            100            web
    10   23            200            email
    10   23            300            gaming
    10   23            300            gaming
.

Come visto ci sono ripetizioni della categoria all'interno di una singola ora. Ho bisogno di calcolare la volatilità e l'ora di punta ai rapporti delle ore medi di queste diverse categorie di applicazioni.

Volatilità : Deviazione standard dei volumi orari divisi per media oraria.

ore di punta a AVG. rapporto ora : rapporto del volume dell'ora massima al vol. dell'ora media per quell'applicazione.

Allora, come posso aggregare e calcolare queste due statistiche per ogni categoria? Sono nuovo a r e non ho molta conoscenza di come aggregare e ottenere le medie come menzionato.

Allora, il risultato finale assisterà qualcosa del genere in cui il volume per ogni categoria è aggregato su un singolo periodo di 24 ore sommando il volume e quindi calcolando le due statistiche

Category    Volatility      Peak to Avg. Ratio
Web            0.55            1.5
P2P            0.30            2.1
email          0.6             1.7
gaming         0.4             2.9
.

Modifica: Plyr mi ha fatto fino a questo.

stats = ddply(
    .data = my_data
    , .variables = .( Hour , Category)
    , .fun = function(x){
        to_return = data.frame(
            volatility = sd((x$Volume)/mean(x$Volume))
            , pa_ratio = max(x$Volume)/mean(x$Volume)
        )
        return( to_return )
    }
)
.

Ma questo non è quello che speravo. Voglio le statistiche per categoria in cui tutte le ore dei giorni sono aggregate prima in 24 ore sommando i volumi e poi il volatilità e il rapporto PA calcolato. Eventuali suggerimenti per il miglioramento?

È stato utile?

Soluzione

You'd need to do it in two stages (using the plyr package): First, as you pointed out, there can be multiple Day-Hour combos for the same category, so we first aggregate, for each category, its totals within each Hour, regardless of the day:

df1 <- ddply( df, .(Hour, Category), summarise, Volume = sum(Volume))

Then you get your stats:

> ddply(df1, .(Category), summarise,
+            Volatility = sd(Volume)/mean(Volume),
+            PeakToAvg = max(Volume)/mean(Volume) )

  Category Volatility PeakToAvg
1      P2P  0.3225399  1.228070
2      Web         NA  1.000000
3    email  0.2999847  1.212121
4   gaming  0.7071068  1.500000
5    video         NA  1.000000
6      web  0.7564398  1.534884
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top