7

ddply の集計操作から得られる結果を並べ替えるための巧妙な方法を知っている人はいますか?

これは、深さの降順で出力を並べ替えるために私が行っていることです。

  ddims <- ddply(diamonds, .(color), summarise, depth = mean(depth), table = mean(table))
  ddims <- ddims[order(-ddims$depth),]

出力で...

> ddims
  color    depth    table
7     J 61.88722 57.81239
6     I 61.84639 57.57728
5     H 61.83685 57.51781
4     G 61.75711 57.28863
1     D 61.69813 57.40459
3     F 61.69458 57.43354
2     E 61.66209 57.49120

それほど醜いわけではありませんが、ddply() 内でうまく行う方法を望んでいます。誰でも方法を知っていますか?

Hadley の ggplot2 book には、ddply とサブセットのこの例がありますが、実際には出力を並べ替えているわけではなく、グループごとに最小の 2 つのダイヤモンドを選択しているだけです。

ddply(diamonds, .(color), subset, order(carat) <= 2)
4

4 に答える 4

8

data.tableこの機会に、実行が高速で (私の認識では) 少なくとも同じくらいエレガントに記述できる を少し宣伝します。

library(data.table)
ddims <- data.table(diamonds)
system.time(ddims <- ddims[, list(depth=mean(depth), table=mean(table)), by=color][order(depth)])

   user  system elapsed 
  0.003   0.000   0.004 

対照的に、順序付けを行わないと、ddplyコードはすでに 30 倍の時間がかかります。

  user  system elapsed 
 0.106   0.010   0.119

Hadley の優れた仕事 (たとえば ) と全般的な素晴らしさに敬意を払っていますが、速度の理由からggplot2、私にとってはdata.table完全に置き換えられたことを告白しなければなりません。ddply

于 2011-04-30T07:25:00.623 に答える
4

ddplyはい、ソートするには、を別の にネストするだけですddplyddplyたとえば、列など、1 つの列で並べ替える方法は次のtableとおりです。

ddimsSortedTable <- ddply(ddply(diamonds, .(color), 
  summarise, depth = mean(depth), table = mean(table)), .(table))

  color    depth    table
1     G 61.75711 57.28863
2     D 61.69813 57.40459
3     F 61.69458 57.43354
4     E 61.66209 57.49120
5     H 61.83685 57.51781
6     I 61.84639 57.57728
7     J 61.88722 57.81239
于 2013-02-06T20:23:17.560 に答える
3

を使用している場合は、より直感的なコードを読み取る演算子dplyrを利用することをお勧めします。%.%

data(diamonds, package = 'ggplot2')
library(dplyr)
diamonds %.%
  group_by(color) %.%
  summarise(
    depth = mean(depth),
    table = mean(table)
  ) %.%
  arrange(desc(depth))
于 2014-01-27T18:41:16.213 に答える