在Wickham的ggplot2书中误解了ddply

时间:2014-02-15 03:57:13

标签: r ggplot2 plyr

Wickham的ggplot2:数据分析的优雅图形的第158页,陈述了这个例子:

选择两颗最小的钻石

ddply(钻石,(颜色),子集,顺序(克拉)LT; = 2)

钻石数据集非常庞大:

> nrow(diamonds)
[1] 53940

所以我选择了一个小样本:

library(plyr)
library(ggplot2)

set.seed(123)
rows=sample(nrow(diamonds),50)
mydiamonds=diamonds[rows,]

然后我在我的套装上尝试了他的命令。

> ddply(mydiamonds,.(color),subset,order(carat)<=2)
   carat     cut color clarity depth table price    x    y    z
1   0.51   Ideal     D     VS2  61.2    55  1882 5.18 5.16 3.16
2   0.58   Ideal     D    VVS1  61.6    60  3154 5.34 5.35 3.29
3   0.70 Premium     E     SI1  59.7    60  2394 5.81 5.79 3.46
4   0.42   Ideal     E     SI2  62.9    56   898 4.80 4.77 3.01
5   0.40 Premium     F     SI1  61.2    58   945 4.74 4.71 2.89
6   0.61 Premium     F     SI1  60.4    56  1359 5.47 5.43 3.29
7   1.52 Premium     G     VS2  62.6    55 12958 7.39 7.28 4.59
8   0.33   Ideal     G    VVS1  61.5    56   868 4.45 4.46 2.74
9   0.71   Ideal     H      IF  62.0    54  3190 5.71 5.75 3.55
10  1.04   Ideal     H     VS2  60.7    56  5805 6.56 6.61 4.00
11  0.70   Ideal     I     SI1  61.8    57  2436 5.67 5.72 3.52
12  0.31   Ideal     I     SI1  62.5    56   537 4.35 4.29 2.70
13  1.35 Premium     J     VS2  60.5    56  6254 7.19 7.12 4.33
14  0.57 Premium     J     VS2  60.2    62  1176 5.40 5.33 3.23

请注意,颜色H的两个最小克拉尺寸分别为0.71和1.04。但是,请考虑以下事项:

> subset(mydiamonds,color=="H")
      carat       cut color clarity depth table price    x    y    z
22060  1.74 Very Good     H     SI2  62.1    59 10086 7.65 7.78 4.79
50726  0.70     Ideal     H     SI1  62.5    56  2294 5.64 5.69 3.54
2458   0.71     Ideal     H      IF  62.0    54  3190 5.71 5.75 3.55
38201  0.44 Very Good     H    VVS1  63.1    56  1016 4.83 4.87 3.06
29333  0.31   Premium     H     VS1  62.6    60   698 4.32 4.30 2.70
17151  1.50      Good     H     SI2  60.8    64  6846 7.27 7.20 4.40
12485  1.07 Very Good     H     VS2  61.5    57  5254 6.57 6.63 4.06
14334  1.04     Ideal     H     VS2  60.7    56  5805 6.56 6.61 4.00

请注意,这表明我没有使用ddply命令选择两种颜色为H的最小克拉钻石。

那么,这是书中的错误还是我对这个问题的误解?什么是正确使用ddply从我的数据集中选择每种颜色的两个最小的钻石?

1 个答案:

答案 0 :(得分:0)

确实它不会返回最小的克拉,而只是列表中的第一批克拉。

要获得两个最小的克拉,您需要获取order函数返回的两个第一个值。以下代码似乎有效:

ddply(mydiamonds,.(color), function(df) df[with(df, order(carat))[1:2], ])

   carat       cut color clarity depth table price    x    y    z
1   0.40     Ideal     D     VS2  61.6    57   982 4.71 4.77 2.92
2   0.50      Fair     D     SI1  65.7    56  1323 5.01 4.97 3.28
3   0.30     Ideal     E     VS1  62.5    56   778 4.30 4.28 2.68
4   0.32 Very Good     E     SI1  63.3    55   672 4.36 4.33 2.75
5   0.40   Premium     F     SI1  61.2    58   945 4.74 4.71 2.89
6   0.61   Premium     F     SI1  60.4    56  1359 5.47 5.43 3.29
7   0.32     Ideal     G    VVS2  61.6    56   708 4.42 4.44 2.73
8   0.33     Ideal     G    VVS1  61.5    56   868 4.45 4.46 2.74
9   0.31   Premium     H     VS1  62.6    60   698 4.32 4.30 2.70
10  0.44 Very Good     H    VVS1  63.1    56  1016 4.83 4.87 3.06
11  0.31     Ideal     I     SI1  62.5    56   537 4.35 4.29 2.70
12  0.70     Ideal     I     SI1  61.8    57  2436 5.67 5.72 3.52
13  0.57   Premium     J     VS2  60.2    62  1176 5.40 5.33 3.23
14  1.35   Premium     J     VS2  60.5    56  6254 7.19 7.12 4.33