我的数据框如下:
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(小数的产品编号都很好)。
我知道的事情:
aggregate(d[, 2], list(d$shop), max)
但是我不知道如何将各个部分组装在一起,例如,商店C
的产品编号从最贵到最便宜,c(1,4,7,10)
。
答案 0 :(得分:0)
这是使用dplyr
和scales::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