R:使用聚合函数的几个标准

时间:2012-05-18 11:45:29

标签: r aggregate plyr data.table

我正在寻找一种解决方案,如何使用聚合函数来总结一个给定其他列中的几个条件的列。 R应该在列中选择一个范围,并考虑另一行的值,在同一行中执行操作。

我想解决的实际问题如下: 我得到了每天每15分钟测量的电力负荷清单,每天超过2年。它看起来像这样:

日期 _ __ _ __ 时间 __ _ __ _ 加载
01-01-2010 00:00-00:15 1234

01-01-2010 00:15-00:30 2313

01-01-2010 ......

01-01-2010 23:30-23:45 2341

...

31-12-2011 23:30-23:45 2347

我的目标是计算所谓的“峰值负载”和“非峰值负载” 山顶时间是早上8点到晚上8点。非高峰是对面的。 所以我想每天计算峰值和非峰值。 因此,我需要每天8:00到20:00汇总并计算当天的剩余负荷。

我也是

感谢您的帮助!

最好的, ˚F

1 个答案:

答案 0 :(得分:4)

我认为你在这里的心理模型正在使这种方式过于复杂。您不必按天分配,然后按峰值/非高峰分组。只是联合发布。

使用ddply

dat <- data.frame(date=rep(seq(5),5),time=runif(25),load=rnorm(25))
library(plyr)
dat$peak <- dat$time<.5
ddply(dat, .(date,peak), function(x) mean(x$load) )

> ddply(dat, .(date,peak), function(x) mean(x$load) )
   date  peak           V1
1     1 FALSE -1.064166845
2     1  TRUE  0.172868201
3     2 FALSE  0.638594830
4     2  TRUE  0.045538051
5     3 FALSE  0.201264770
6     3  TRUE  0.054019462
7     4 FALSE  0.722268759
8     4  TRUE -0.490305933
9     5 FALSE  0.003411591
10    5  TRUE  0.628566966

使用aggregate

> aggregate(dat$load, list(dat$date,dat$peak), mean )
   Group.1 Group.2            x
1        1   FALSE -1.064166845
2        2   FALSE  0.638594830
3        3   FALSE  0.201264770
4        4   FALSE  0.722268759
5        5   FALSE  0.003411591
6        1    TRUE  0.172868201
7        2    TRUE  0.045538051
8        3    TRUE  0.054019462
9        4    TRUE -0.490305933
10       5    TRUE  0.628566966

只是为了它的乐趣,基准

首先,使用上述5x5条目:

> microbenchmark(
+   ddply(dat, .(date,peak), function(x) mean(x$load) ),
+   aggregate(dat$load, list(dat$date,dat$peak), mean )
+   )
Unit: milliseconds
                                                 expr      min       lq   median       uq      max
1 aggregate(dat$load, list(dat$date, dat$peak), mean) 1.323438 1.376635 1.445769 1.549663 2.853348
2 ddply(dat, .(date, peak), function(x) mean(x$load)) 4.057177 4.292442 4.386289 4.534728 6.864962

5x5 benchmarks

接下来使用500x500条目

> m
Unit: milliseconds
                                                 expr      min       lq   median       uq      max
1 aggregate(dat$load, list(dat$date, dat$peak), mean) 558.9524 570.7354 590.4633 599.4404 634.3201
2 ddply(dat, .(date, peak), function(x) mean(x$load)) 317.7781 348.1116 361.7118 413.4490 503.8540

500x500 benchmarks

50x50基准

n <- 50
dat <- data.frame(date=rep(seq(n),n),time=runif(n),load=rnorm(n))
dat$peak <- dat$time<.5

library(plyr)
library(microbenchmark)
library(data.table)
DT <- as.data.table(dat)
m <- microbenchmark(
  ddply(dat, .(date,peak), function(x) mean(x$load) ),
  aggregate(dat$load, list(dat$date,dat$peak), mean ),
  DT[,.Internal(mean(load)),keyby=list(date,peak)]
  )
m
plot(m)

50x50

因此聚合对于小问题来说更快(可能是因为它加载了所有机器的开销更少),并且ddply对于大问题(速度很重要)更快。 Data.table将一切都吹走了(像往常一样)。