我有一个数据框,其中有一个日期,一个字符串(关键字)和一个指标(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)
如果有任何更好的方法的建议,将不胜感激!
答案 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创建。