7
votes

Calculer la moyenne sur plusieurs cadres de données

J'aimerais utiliser R pour le traçage des résultats d'évaluation des performances des systèmes DB distincts. Pour chaque système, j'ai chargé les mêmes données et exécutez les mêmes requêtes dans plusieurs itérations.

Les données pour un seul système ressemble à ceci: xxx

Qu'est-ce dont j'ai besoin maintenant ( pour la traçage) est une matrice ou un cadre de données contenant la moyenne de ces mesures.

pour le moment je fais cela: xxx

je pourrais mettre tout Ceci dans une fonction et calculer la matrice moyenne dans A pour la boucle, mais j'ai le sentiment vague qu'il doit y avoir une solution plus élégante. Toutes idées?

Que puis-je faire pour les cas lorsque j'ai des résultats incomplets, par exemple, quand une itération a moins de lignes que les autres?

Merci!

r

0 commentaires

5 Réponses :


0
votes

essayer, par exemple, xxx


0 commentaires

1
votes

Avez-vous eu quelque chose comme ça à l'esprit?

do.call("rbind", lapply(results, mean))


0 commentaires

4
votes

Si je vous comprends correctement, sur un système de DB donné, dans chaque "itération" (1 ... n), vous chargez une séquence de jeux de données (1,2,3) et utilisez-les sur eux. Cela semble à la fin, vous souhaitez calculer le temps moyen sur toutes les itérations, pour chaque jeu de données fort>. Si tel est le cas, vous devez avoir une colonne supplémentaire Dataset code> dans votre table All_Results code> qui identifie l'ensemble de données. Nous pouvons ajouter cette colonne comme suit: xxx pré>

Vous pouvez maintenant utiliser la fonction ddply code> à partir du package code> Plyr code> pour extraire facilement les moyennes de Les temps de chargement et de requête pour chaque ensemble de données. P>

> ddply(all_results, .(DataSet), colwise(mean, .(loadTime, query1, query2)))
  DataSet loadTime    query1 query2
1       1 158.1000 0.4333333    5.7
2       2 236.8000 0.4000000    3.4
3       3 155.2667 0.3333333    5.9


3 commentaires

C'est vraiment plus élégant que pour les boucles ... Merci pour l'indice.


Et si je veux inclure la colonne "Lines" dans le cadre de sortie de DDPLY? Je pourrais le faire en calculant simplement la moyenne aussi sur les lignes; Mais cela n'a pas de sens, car les numéros de ligne sont des valeurs statiques;


Je vois ce que tu veux dire, mais je suppose qu'il n'y a pas de mal à prendre le "méchant" d'un tas de valeurs identiques!



1
votes

Essayez ceci:

> it <- all_results$iteration
> aggregate(all_results, list(data.set = seq_along(it) - match(it, it) + 1), mean)
  data.set iteration lines loadTime    query1 query2   query3
1        1         2 1e+05 158.1000 0.4333333    5.7 3.033333
2        2         2 1e+05 236.8000 0.4000000    3.4 2.633333
3        3         2 5e+04 155.2667 0.3333333    5.9 1.300000


4 commentaires

Je pensais à suggérer la même chose, mais + ne fonctionne pas si chaque data.frame n'est pas la même taille.


Les cadres de données ont la même taille depuis que l'affiche indique que le code qu'il affichait fonctionne, mais il ne veut que quelque chose de plus "élégant".


@Gabor je faisais référence à la dernière phrase de sa question.


D'ACCORD. J'ai ajouté une deuxième solution. On pourrait définir une fonction plus mais dans ce cas, je pense que c'est plus facile d'utiliser l'agrégat.



3
votes

Je ne vois pas pourquoi vous devez diviser all_results code> par itération code>. Vous pouvez simplement utiliser agrégat code> sur all_results code>. Il n'est pas nécessaire que toutes les itérations ont le même nombre d'observations.

Lines <- "iteration, lines, loadTime, query1, query2, query3
1, 100000, 120.4, 0.5, 6.4, 1.2
1, 100000, 110.1, 0.1, 5.2, 2.1
1, 50000, 130.3, 0.2, 4.3, 2.2
2, 100000, 120.4, 0.1, 2.4, 1.2
2, 100000, 300.2, 0.2, 4.5, 1.4
2, 50000, 235.3, 0.4, 4.2, 0.5
3, 100000, 233.5, 0.7, 8.3, 6.7
3, 100000, 300.1, 0.9, 0.5, 4.4
3, 50000, 100.2, 0.4, 9.2, 1.2"

all_results <- read.csv(textConnection(Lines))

aggregate(all_results[,-1], by=all_results[,"iteration",drop=FALSE], mean)


2 commentaires

Je pense que l'OP doit en moyenne par Dataset comme je l'ai dit dans ma réponse, non pas par "itération" (il n'a pas de sens de prendre la moyenne d'un jeu de données contenant 100 000 lignes et une avec 50000 lignes). Au moins c'est mon interprétation de ce qu'il veut vraiment faire.


... mais l'idée d'utiliser agrégat est bien cependant (+1). J'essayais simplement de l'utiliser comme un exercice pour pratiquer avec Plyr .