【问题标题】:Special advantage of `ddply` over `stats::ave`?`ddply` 优于 `stats::ave` 的特殊优势?
【发布时间】:2014-08-09 12:56:49
【问题描述】:

使用此数据集 (InsectSprays)。

> d <- InsectSprays
> str(d)
'data.frame':   72 obs. of  3 variables:
 $ count: num  10 7 20 14 14 12 10 23 17 20 ...
 $ spray: Factor w/ 6 levels "A","B","C","D",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ total: num  174 174 174 174 174 174 174 174 174 174 ...

对于每个单独的因素(即喷雾类型),如何将计数总数添加到每次观察中? IE。我们想要

> head(d)
  count spray total
1    10     A   174
2     7     A   174
3    20     A   174
4    14     A   174
5    14     A   174
6    12     A   174

在一些讲座中,建议使用ddply

> head(ddply(d, .(spray), summarize, sum=ave(count, FUN=sum)))
  spray sum
1     A 174
2     A 174
3     A 174
4     A 174
5     A 174
6     A 174

与单独使用 ave 相比,此命令有什么特别的优势吗?

> d$total <- ave(d$count, d$spray, FUN=sum)
> head(d)
  count spray total
1    10     A   174
2     7     A   174
3    20     A   174
4    14     A   174
5    14     A   174
6    12     A   174

我并不是说ddply 没有优点,但在这个特定的例子中,我觉得我没有看到使用它的意义。

ddply 应用程序在这里有什么特别的优势吗?

【问题讨论】:

  • 你可以使用ddply(d, .(spray), mutate, total=sum(count))得到类似的结果
  • 我认为plyr 的大多数拥护者发现语法更清晰——尤其是它的灵活性,而在基础 R 中,您可能需要交替使用 avetapplyaggregate但是在这一点上,dplyr 基本上取代了plyr::ddply,它具有显着的速度优势和一致的语法。

标签: r plyr


【解决方案1】:

我不知道...

> library("microbenchmark")
> microbenchmark(ddply(d, .(spray), summarize, sum=ave(count, FUN=sum)), d$total <- ave(d$count, d$spray, FUN=sum))
Unit: microseconds
                                                       expr      min        lq    median        uq       max neval
 ddply(d, .(spray), summarize, sum = ave(count, FUN = sum)) 4262.996 4418.8750 4504.3195 4620.7480 10167.530   100
                d$total <- ave(d$count, d$spray, FUN = sum)  222.080  232.2795  249.2145  267.8815   620.822   100

【讨论】:

  • 好吧,可能导师只是想表现得令人印象深刻。
猜你喜欢
  • 2013-09-11
  • 2012-09-20
  • 1970-01-01
  • 2014-03-06
  • 2020-11-23
  • 1970-01-01
  • 2010-11-15
  • 2012-04-20
  • 2011-03-27
相关资源
最近更新 更多