按组别订购

时间:2015-05-10 11:46:45

标签: r data.table dplyr

以ggplot中的钻石数据集为例我想按每种颜色的总价格订购数据框,所以如果这是每种颜色的总价格

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'categories1_.category' in 'field list'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 

我想对原始数据框进行排序,以便按照上面相同的顺序显示颜色

所以,如果我们有像这样的原始数据集的样本

H        5000
I        4000    
E        1000
J        3000

它应该被分类为类似的东西

carat   cut        color    clarity depth   table   price
0.23    Ideal        E        SI2   61.5    55       326
0.21    Premium      E        SI1   59.8    61       326
0.23    Good         E        VS1   56.9    65       327
0.29    Premium      I        VS2   62.4    58       334
0.31    Good         J        SI2   63.3    58       335
0.24    Very Good    J        VVS2  62.8    57       336
0.24    Very Good    I        VVS1  62.3    57       336
0.26    Very Good    H         SI1  61.9    55       337

因为H颜色的总价格最高,然后我等等。

我可以按每种颜色的总价格订购颜色,但我想订购 数据按颜色设置

如上所述。

我们可以更好地按每个记录的价格进行另一次订购,这样就可以这样了

carat   cut        color    clarity depth   table   price
0.26    Very Good    H        SI1   61.9    55       337    
0.24    Very Good    I        VVS1  62.3    57       336
0.29    Premium      I        VS2   62.4    58       334
0.23    Ideal        E        SI2   61.5    55       326
0.21    Premium      E        SI1   59.8    61       326
0.23    Good         E        VS1   56.9    65       327
0.31    Good         J        SI2   63.3    58       335
0.24    Very Good    J        VVS2  62.8    57       336

2 个答案:

答案 0 :(得分:2)

使用data.table我会执行以下操作(使用您提供的数据)

library(data.table)
# convert to `data.table` and assign a TotSum column (per color) by reference
setDT(df)[, TotSum := sum(price), by = color]
# sort your data by total sum (decreasing), color (in case two colors will have the same total price) and by price (decreasing)
setorder(df, -TotSum, color, -price) 
df
#    carat       cut color clarity depth table price TotSum
# 1:  0.23      Good     E     VS1  56.9    65   327    979
# 2:  0.23     Ideal     E     SI2  61.5    55   326    979
# 3:  0.21   Premium     E     SI1  59.8    61   326    979
# 4:  0.24 Very Good     J    VVS2  62.8    57   336    671
# 5:  0.31      Good     J     SI2  63.3    58   335    671
# 6:  0.24 Very Good     I    VVS1  62.3    57   336    670
# 7:  0.29   Premium     I     VS2  62.4    58   334    670
# 8:  0.26 Very Good     H     SI1  61.9    55   337    337

在这里,我们为每种颜色创建了一个TotSum的新列,并按照每个颜色的总和,颜色和价格,通过引用创建了有序df

答案 1 :(得分:0)

我不确定我是否完全理解您想要的顺序,但如果首先是按价格,然后按颜色,按降序排列,那么您可以这样做:

library('ggplot2')
library('dplyr')
tst <- dplyr::arrange(diamonds, desc(color), desc(price))

这给出了head(tst)

  carat     cut color clarity depth table price    x    y    z
1  3.01 Premium     J     SI2  60.7    59 18710 9.35 9.22 5.64
2  3.01 Premium     J     SI2  59.7    58 18710 9.41 9.32 5.59
3  2.22 Premium     J     VS1  60.0    60 18706 8.49 8.43 5.08
4  3.51 Premium     J     VS2  62.5    59 18701 9.66 9.63 6.03
5  2.43 Premium     J     VS2  62.2    57 18692 8.63 8.54 5.34
6  2.42 Premium     J     VS2  61.3    59 18615 8.61 8.58 5.27