【问题标题】:Scale values in a dataframe by category按类别缩放数据框中的值
【发布时间】:2018-07-02 11:57:21
【问题描述】:

我有一个数据框如下:

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)

【问题讨论】:

  • 请说明你是如何到达c(1,4,7,10) 的 C 以及你如何定义 #1 的规模。
  • 正如我在 OP 中所说,我并不是要重新调整价格 --- 如下面的误用答案所示。我正在尝试重新调整产品编号。在 1:10 范围内重新调整四个数字 1:4 会在数字之间产生 3 的相等间隙 ... c(1, 4, 7, 10)。当然,很容易对@misuse answer 进行所需的细微更改。
  • 看来我的问题是重复的。我没有意识到。 stackoverflow.com/questions/41761018/…

标签: r dataframe aggregate


【解决方案1】:

这是一种使用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

【讨论】:

  • 谢谢...但还要注意,我想重新调整的是产品编号,而不是价格;与您展示的解决方案相比,这只是一个微小的变化。通过重新调整价格,最终所有“最昂贵”产品的价值都为 1,而我想保留实际价格,以便确定所有“最便宜”产品的分布(例如)。
猜你喜欢
  • 2017-12-04
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2019-03-25
  • 2020-04-01
  • 2017-06-19
  • 1970-01-01
相关资源
最近更新 更多