R: суммировать фрейм данных с повторяющимися строками в коробочные диаграммы - PullRequest
2 голосов
/ 17 июля 2011

Я - новичок R, с фреймом данных времени выполнения функций базы данных со следующими данными:

> head(data2)
              dbfunc runtime
1 fn_slot03_byperson  38.083
2 fn_slot03_byperson  32.396
3 fn_slot03_byperson  41.246
4 fn_slot03_byperson  92.904
5 fn_slot03_byperson 130.512
6 fn_slot03_byperson 113.853

Данные имеют данные для 127 дискретных функций, состоящих из приблизительно 1940170 строк.

Я хотел бы:

  1. Суммировать данные, чтобы включить только функции базы данных со средним временем выполнения более 100 мс
  2. Создание блокпостов из 25 самых медленных функций базы данных, показывающих распределение времени выполнения, отсортировано сначала по самому медленному.

Я особенно озадачен шагом суммирования.

Примечание: я также задавал эти вопросы на stats.stackexchange.com .

Ответы [ 3 ]

3 голосов
/ 17 июля 2011

Вот один подход, использующий ggplot и plyr.Шаги, которые вы описали, могут быть объединены, чтобы быть немного более эффективными, но в целях обучения я покажу вам шаги, как вы их просили.

#Load ggplot and make some fake data
library(ggplot2)
dat <- data.frame(dbfunc = rep(letters[1:10], each = 100)
                  , runtime = runif(1000, max = 300))

#Use plyr to calculate a new variable for the mean runtime by dbfunc and add as 
#a new column
dat <- ddply(dat, "dbfunc", transform, meanRunTime = mean(runtime))

#Subset only those dbfunc with mean run times greater than 100. Is this step necessary?
dat.long <- subset(dat, meanRunTime > 100)


#Reorder the level for the dbfunc variable in terms of the mean runtime. Note that relevel
#accepts a function like mean so if the subset step above isn't necessary, then we can simply
#use that instead.
dat.long$dbfunc <- reorder(dat.long$dbfunc, -dat.long$meanRunTime)

#Subset one more time to get the top *n* dbfunctions based on mean runtime. I chose three here...
dat.plot <- subset(dat.long, dbfunc %in% levels(dbfunc)[1:3])

#Now you have your top three dbfuncs, but a bunch of unused levels hanging out so let's drop them
dat.plot$dbfunc <- droplevels(dat.plot$dbfunc)

#Plotting time!
ggplot(dat.plot, aes(dbfunc, runtime)) + 
  geom_boxplot()

Как я уже сказал, некоторые из этих шагов могутбыть объединенным и сделанным более эффективным, но хотел показать вам шаги, как вы обрисовали их в общих чертах.

1 голос
/ 23 июля 2011

Сводка просто:

attach(data2)
func_mean = tapply(runtime, dbfunc, mean)

вопрос объявления 1:

func_mean[func_mean > 100]

вопрос объявления 2:

slowest25 = head(sort(func_mean, decreasing = TRUE), n=25)
sl25_data = merge(data.frame(dbfunc = names(slowest25), data2, sort = F)
plot(sl25_data$runtime ~ sl25_data$dbfunc)

Надеюсь, это поможетТем не менее, сюжеты не отсортированы в сюжете.

0 голосов
/ 31 июля 2011

Я публикую это как «ответ», тогда как ответы Томаса и Чейза на самом деле более полны. В случае Чейза я не мог заставить работать ggplot, и времени было мало. В случае с Томасом я застрял на шаге sl25_data.

В итоге мы использовали следующее, что работает с одной оставшейся проблемой:

# load data frame
dbruntimes <- read.csv("db_runtimes.csv",sep=',',header=FALSE)
# calc means
meanruns <- aggregate(dbruntimes["runtime"],dbruntimes["dbfunc"],mean)
# filter
topmeanruns <- meanruns[meanruns$runtime>100,]
# order by means
meanruns <- meanruns[rev(order(meanruns$runtime)),]
# get top 25 results
drawfuncs <- meanruns[1:25,"dbfunc"]
# subset for plot
forboxplot <- subset(dbruntimes,dbfunc %in% levels(drawfuncs)[0:25])
# plot
boxplot(forboxplot$runtime~forboxplot$dbfunc)

Это дает нам результат, который мы ищем, но все функции по-прежнему показаны на графике xaxis, а не только в верхних 25.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...