这是几天前我在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
的总和。例如,在瑞典,销量最高的product
是Apple
,因此我想编写代码以找出apple
是销量最高的product
(总计,这就是我感兴趣),然后汇总values
瑞典apples
中售出的country
的所有344
。
我还希望能够基于country
和year
找到第n个最大值。也就是说,如果我要寻找product
2013年瑞典销量最高的year
,它应该返回product
Candy和value
300。
答案 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