【问题标题】:R - Aggregating and returning value that minimises another dimensionR - 最小化另一个维度的聚合和返回值
【发布时间】:2018-12-27 13:51:54
【问题描述】:

我有一个数据框,其中包含日期、字符串(关键字)和指标(CPA)。

看起来像这样:

Day          Keyword             CPA              
1/1/18       trip                11.88
2/1/18       trip                14.91
3/1/18       motorbike           13.68
4/1/18       motorbike           16.31
5/1/18       hotel               11.88
6/1/18       hotel               14.91
11/1/18      hotel               13.68
13/1/18      car                 16.31

对于每个关键字字符串,我想返回 CPA 最低的那一天。

所以在这种情况下它会返回:

Lowest CPA Day          Keyword            
1/1/18                  trip                          
3/1/18                  motorbike                    
5/1/18                  hotel                        
13/1/18                 car                 

我可以返回最低的每次转化费用:

report_CPA_lowest <- report_CPA %>% select(Keyword, CPA) %>%
                                    group_by(Keyword) %>%
                                    summarise(
                                      lowest_CPA = min(CPA)
                                    ) %>% arrange(lowest_CPA) 

但是当我试图返回这一天时,我失败了:

report_CPA_lowest <- report_CPA %>% select(Keyword, CPA) %>%
                                    group_by(Keyword) %>%
                                    summarise(
                                      lowest_CPA_date = which(Day == min(CPA))
                                    ) %>% arrange(lowest_CPA_date)

如果有更好的方法建议,我们将不胜感激!

【问题讨论】:

    标签: r group-by dplyr aggregation


    【解决方案1】:

    (为重现性加载数据)

    library(dplyr)
    
    report_CPA <- read.table(text = "
    Day          Keyword             CPA              
    1/1/18       trip                11.88
    2/1/18       trip                14.91
    3/1/18       motorbike           13.68
    4/1/18       motorbike           16.31
    5/1/18       hotel               11.88
    6/1/18       hotel               14.91
    11/1/18      hotel               13.68
    13/1/18      car                 16.31", header = TRUE)
    

    您需要使用[ ] 访问这些值。在这种情况下,您也可以使用which.min 代替更通用的which。

    report_CPA %>%
      group_by(Keyword) %>%
      summarise(
        lowest_CPA = min(CPA),
        lowest_CPA_date = Day[which.min(CPA)]
      )
    

    输出:

      Keyword   lowest_CPA lowest_CPA_date
      <fct>          <dbl> <fct>          
    1 trip            11.9 1/1/18         
    2 car             16.3 13/1/18        
    3 motorbike       13.7 3/1/18         
    4 hotel           11.9 5/1/18  
    

    【讨论】:

      【解决方案2】:

      我会选择

      df %>% group_by(Keyword) %>% slice(which.min(CPA))
      
      ## A tibble: 4 x 3
      ## Groups:   Keyword [4]
      #  Day     Keyword     CPA
      #  <fct>   <fct>     <dbl>
      #1 13/1/18 car        16.3
      #2 5/1/18  hotel      11.9
      #3 3/1/18  motorbike  13.7
      #4 1/1/18  trip       11.9
      

      这将简单地选择每个关键字具有最低 CPA 的(第一)行。

      【讨论】:

        【解决方案3】:

        使用dplyr::top_n

        library(dplyr)
        report_CPA %>%
          group_by(Keyword) %>%
          top_n(-1,CPA)
        
        # # A tibble: 4 x 3
        # # Groups:   Keyword [4]
        #   Day     Keyword     CPA
        #   <fct>   <fct>     <dbl>
        # 1 1/1/18  trip       11.9
        # 2 3/1/18  motorbike  13.7
        # 3 5/1/18  hotel      11.9
        # 4 13/1/18 car        16.3
        

        负指数表示您过滤最小值。

        在基础 R

        do.call(rbind, by(report_CPA,report_CPA$Keyword,function(x)x[which.min(x$CPA),]))
        

        或

        do.call(rbind,lapply(split(report_CPA, report_CPA$Keyword),function(x)x[which.min(x$CPA),]))
        #               Day   Keyword   CPA
        # car       13/1/18       car 16.31
        # hotel      5/1/18     hotel 11.88
        # motorbike  3/1/18 motorbike 13.68
        # trip       1/1/18      trip 11.88
        

        【讨论】:

          【解决方案4】:
          library(data.table)
          
          input <- as.data.table(input) # 2018-01-01
          input[, Day := as.POSIXct(Day)]
          input[, .(minCPA = min(CPA), minDate = min(Day)), by = .(Keyword)][]
          
               Keyword minCPA             minDate
          1:      trip  11.88 2018-01-01 03:00:00
          2: motorbike  13.68 2018-01-03 03:00:00
          3:     hotel  11.88 2018-01-05 03:00:00
          4:       car  16.31 2018-01-13 03:00:00
          

          【讨论】:

            【解决方案5】:

            安排好后,slice第一个值

              report_CPA %>% 
              group_by(Keyword) %>% 
              arrange(desc(Keyword, CPA)) %>% 
              slice(1)
            
            #> # A tibble: 4 x 3
            #> # Groups:   Keyword [4]
            #>   Day     Keyword     CPA
            #>   <fct>   <fct>     <dbl>
            #> 1 13/1/18 car        16.3
            #> 2 5/1/18  hotel      11.9
            #> 3 3/1/18  motorbike  13.7
            #> 4 1/1/18  trip       11.9
            

            由reprex package (v0.2.0) 于 2018 年 7 月 19 日创建。

            【讨论】:

              猜你喜欢
              • 2017-08-31
              • 1970-01-01
              • 1970-01-01
              • 2018-01-14
              • 2020-01-12
              • 1970-01-01
              • 1970-01-01
              • 2020-07-07
              • 1970-01-01
              相关资源
              最近更新 更多