R-汇总和返回值,将另一个维度最小化

时间:2018-07-19 12:12:06

标签: r group-by dplyr aggregation

我有一个数据框,其中有一个日期,一个字符串(关键字)和一个指标(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)

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

5 个答案:

答案 0 :(得分:2)

(加载数据以提高可重复性)

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  

答案 1 :(得分:1)

我愿意

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的(第一)行。

答案 2 :(得分:1)

使用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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

安排好后,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-07-19创建。