代码之家  ›  专栏  ›  技术社区  ›  KGB91

根据条件查找第n个最大值[重复]

r
  •  -3
  • KGB91  · 技术社区  · 6 年前

    这与我几天前在Excel中遇到的问题基本相同( Excel - find nth largest value based on criteria ),但这次是在R中(数据集包含50万个条目,这似乎超出了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 在特定地区销售的 country product 在瑞典是 Apple 所以我想通过编码找到它 apple 产品 values 已售出的 apples 国家 瑞典, 344

    我还希望能够找到第n个最大值,基于这两个 国家 year . 也就是说,如果我在寻找最畅销的 产品 2013年,它应该归还 产品 价值 300

    1 回复  |  直到 6 年前
        1
  •  2
  •   LAP    6 年前

    第一个问题的解决方案(查找每个国家销售最多的产品,总结此产品的价值)使用 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
    

    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年的输出(修改表中的2) 1: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