根据条件找出第n个最大值

时间:2018-09-17 07:23:29

标签: r

这是几天前我在Excel(Excel - find nth largest value based on criteria)中遇到的基本相同的问题,但是这次是在R中(数据集包含500万个条目,这比Excel似乎能够解决的更多)处理)。

我有一个从Excel导入的表格,如下所示:

Country Region      Code Product name Year Value
Sweden  Stockholm   123  Apple        1991 244   
Sweden  Kirruna     123  Apple        1987 100
Japan   Kyoto       543  Pie          1987 544
Denmark Copenhagen  123  Apple        1998 787
Denmark Copenhagen  123  Apple        1987 100
Denmark Copenhagen  543  Pie          1991 320
Denmark Copenhagen  126  Candy        1999 200
Sweden  Gothenburg  126  Candy        2013 300
Sweden  Gothenburg  157  Tomato       1987 150
Sweden  Stockholm   125  Juice        1987 250
Sweden  Kirruna     187  Banana       1998 310
Japan   Kyoto       198  Ham          1987 157
Japan   Kyoto       125  Juice        1987 550
Japan   Tokyo       125  Juice        1991 100

我想做的是编写一个代码,该代码可以给我提供在特定value中出售的products中第n大country的总和。例如,在瑞典,销量最高的productApple,因此我想编写代码以找出apple是销量最高的product(总计,这就是我感兴趣),然后汇总values瑞典apples中售出的country的所有344

我还希望能够基于countryyear找到第n个最大值。也就是说,如果我要寻找product 2013年瑞典销量最高的year,它应该返回product Candy和value 300。

1 个答案:

答案 0 :(得分:2)

第一个问题的解决方案(在每个国家/地区查找最畅销的产品,总结该产品的价值),使用dplyr

library(tidyverse)

df %>%
  group_by(Country, Product_name) %>%
  summarise(sum_value = sum(Value, na.rm = TRUE)) %>%
  ungroup() %>%
  group_by(Country) %>%
  filter(sum_value == max(sum_value))

# A tibble: 3 x 3
# Groups:   Country [3]
  Country Product_name sum_value
   <fctr>       <fctr>     <int>
1 Denmark        Apple       887
2   Japan        Juice       650
3  Sweden        Apple       344

第二个问题的解决方案(显示每个国家和地区的第n个最畅销产品,总价值):

df %>%
  group_by(Country, Product_name, Year) %>%
  summarise(sum_value = sum(Value, na.rm = TRUE)) %>%
  ungroup() %>%
  group_by(Country, Year) %>%
  arrange(desc(sum_value), .by_group = TRUE) %>%
  slice(., 1:2)

必须稍稍更改数据以获得体面的输出,所以这里是所有年份设置为1987的输出(将最后一行中的1:2中的2更改为不同的n) :

# A tibble: 6 x 4
# Groups:   Country, Year [3]
  Country Product_name  Year sum_value
   <fctr>       <fctr> <int>     <int>
1 Denmark        Apple  1987       887
2 Denmark          Pie  1987       320
3   Japan        Juice  1987       650
4   Japan          Pie  1987       544
5  Sweden        Apple  1987       344
6  Sweden       Banana  1987       310