按类别缩放数据框中的值

时间:2018-07-02 11:57:22

标签: r dataframe aggregate

我的数据框如下:

d <- data.frame(
    shop=c('A','A','A','A','A','B','B','B','C','C','C','C','D','E','E'),
    product=c(1:5,1:3,1:4,1,1:2), 
    price=c(16.83, 12.21, 9.99, 3.99, 1.00,
      19.50, 6.42, 1.89,
      13.95, 12.50, 7.87, 0.79,
      11.99,
      22.80, 15.99)  )

数据代表商店所持有产品的价格,产品在每个商店中按相反的价格顺序编号。我想了解有关整个商店中最昂贵的商品,以及最便宜的类似商品的各种信息(例如,均值,分布,最高价格)。考虑到这一点,我想重新调整产品编号,以便在所有商店中,最贵的商店编号为1,最便宜的商店编号为10(小数的产品编号都很好)。

我知道的事情:

  1. 如何使用最大值来缩放产品编号的单个向量 和最小值
  2. 如何通过商店获取最大商品数: aggregate(d[, 2], list(d$shop), max)

但是我不知道如何将各个部分组装在一起,例如,商店C的产品编号从最贵到最便宜,c(1,4,7,10)

1 个答案:

答案 0 :(得分:0)

这是使用dplyrscales::rescale的一种方法:

df %>%
  group_by(shop) %>% #group by shop
    arrange(shop, desc(price)) %>% #arrange by shop and price
    mutate(scaled = 1:n(), #create a label for price (in this case it matches the product id but in some cases it might not)
           scaled = scales::rescale(scaled, to = c(1, 10)))

缩放至1-10

#output
# A tibble: 15 x 4
# Groups:   shop [5]
   shop  product price scaled
   <fct>   <dbl> <dbl>  <dbl>
 1 A           1 16.8    1   
 2 A           2 12.2    3.25
 3 A           3  9.99   5.5 
 4 A           4  3.99   7.75
 5 A           5  1     10   
 6 B           1 19.5    1   
 7 B           2  6.42   5.5 
 8 B           3  1.89  10   
 9 C           1 14.0    1   
10 C           2 12.5    4   
11 C           3  7.87   7   
12 C           4  0.79  10   
13 D           1 12.0    5.5 #one item in category, it is both min and max, so (1+10)/2 = 5.5
14 E           1 22.8    1   
15 E           2 16.0   10   

要获得最大产品编号,可以在分组后使用摘要:

df %>%
  group_by(shop) %>%
  summarise(max = max(product))
#output
# A tibble: 5 x 2
  shop    max
  <fct> <dbl>
1 A      5.00
2 B      3.00
3 C      4.00
4 D      1.00
5 E      2.00

或者如果要一次汇总几个变量(在此处第2和3列):

df %>%
  group_by(shop) %>%
  summarise_at(2:3, max)
## A tibble: 5 x 3
  shop  product price
  <fct>   <dbl> <dbl>
1 A        5.00  16.8
2 B        3.00  19.5
3 C        4.00  14.0
4 D        1.00  12.0
5 E        2.00  22.8