【问题标题】:Group By and Filter Between Dates分组依据和日期之间的筛选
【发布时间】:2019-02-14 01:02:53
【问题描述】:

我正在尝试将订单表过滤到每个人第一年的订单价值。

我的数据采用以下格式,其中每一行代表一个订单,但我添加了客户级别的列来表示他们的第一个订单日期 (Recruitment Date) 以及标志着每个客户以来一年的日期第一次订购 (1st Year Since Recruitment) 和招聘后的第二年;最后一列是当前订单支付的金额。

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   1876202 obs. of  6 variables:
 $ Brand_Acc                 : chr  "B000000001" "B000000002" "B000000002" "B000000002" ...
 $ salesdate                 : Date, format: "2008-03-10" "2008-02-19" "2008-07-14" "2010-08-25" ...
 $ Recruitment Date          : Date, format: "2008-03-10" "2008-02-19" NA NA ...
 $ 1st Year Since Recruitment: Date, format: "2009-03-10" "2009-02-19" NA NA ...
 $ 2nd Year Since Recruitment: Date, format: "2010-03-10" "2010-02-19" NA NA ...
 $ TotalDiscount             : num  97.9 349.9 184.9 284.9 348.9 ...

我想返回一个数据框,用于捕获每个客户第一年的订单价值。

我尝试了以下方法:

df %>%
  group_by(Brand_Acc) %>%
  filter(salesdate, between(`Recruitment Date`, `1st Year Since Recruitment`))

但我收到此错误:

Error in filter_impl(.data, quo) : Evaluation error: argument "right" is missing, with no default.

这样做的正确方法是什么?

编辑显示前 5 行的输入:

dput(df)
structure(list(Brand_Acc = c("B000000001", "B000000002", "B000000002", 
"B000000002", "B000000006"), salesdate = structure(c(13948, 13928, 
14074, 14846, 13934), class = "Date"), ordertype = c("Recruitment", 
"Recruitment", "Conversion", "Active Order", "Recruitment"), 
    actv_channel = c("MainMail", "MainMail", "Outbound-Other", 
    "MainMail", "MainMail"), TotalDiscount = c(97.87, 349.88, 
    184.94, 284.94, 348.9), campaignparentid = c("9017", "9017", 
    "9035", "9557", "9017"), BrandAccount_Brand = c("wp", "wp", 
    "wp", "wp", "wp"), recrtype = c("STNRD", "STNRD", "STNRD", 
    "STNRD", "STNRD"), POA_CODE = structure(c(1937L, 2302L, 2302L, 
    2302L, 466L), .Label = c("0", "200", "800", "801", "804"), class = "factor"), 
    `Recruitment Date` = structure(c(13948, 13928, NA, NA, 13934
    ), class = "Date"), `1st Year Since Recruitment` = structure(c(14313, 
    14294, NA, NA, 14300), class = "Date"), `2nd Year Since Recruitment` = structure(c(14678, 
    14659, NA, NA, 14665), class = "Date"), `3rd Year Since Recruitment` = structure(c(15043, 
    15024, NA, NA, 15030), class = "Date")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L))
> ```





【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    令人惊讶的是,between 在其leftright 参数中并未矢量化,您可能已经预料到了这一点,因为它将自己描述为<=>= 组合的简单替代品。我们只需要长途跋涉:

    library(tidyverse)
    df <- structure(list(Brand_Acc = c("B000000001", "B000000002", "B000000002", "B000000002", "B000000006"), salesdate = structure(c(13948, 13928, 14074, 14846, 13934), class = "Date"), ordertype = c("Recruitment", "Recruitment", "Conversion", "Active Order", "Recruitment"), actv_channel = c("MainMail", "MainMail", "Outbound-Other", "MainMail", "MainMail"), TotalDiscount = c(97.87, 349.88, 184.94, 284.94, 348.9), campaignparentid = c("9017", "9017", "9035", "9557", "9017"), BrandAccount_Brand = c("wp", "wp", "wp", "wp", "wp"), recrtype = c("STNRD", "STNRD", "STNRD", "STNRD", "STNRD"), POA_CODE = structure(c(1937L, 2302L, 2302L, 2302L, 466L), .Label = c("0", "200", "800", "801", "804"), class = "factor"), `Recruitment Date` = structure(c(13948, 13928, NA, NA, 13934), class = "Date"), `1st Year Since Recruitment` = structure(c(14313, 14294, NA, NA, 14300), class = "Date"), `2nd Year Since Recruitment` = structure(c(14678, 14659, NA, NA, 14665), class = "Date"), `3rd Year Since Recruitment` = structure(c(15043, 15024, NA, NA, 15030), class = "Date")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -5L))
    df %>%
      group_by(Brand_Acc) %>%
      filter(salesdate >= `Recruitment Date` & salesdate <= `1st Year Since Recruitment`)
    #> # A tibble: 3 x 13
    #> # Groups:   Brand_Acc [3]
    #>   Brand_Acc salesdate  ordertype actv_channel TotalDiscount
    #>   <chr>     <date>     <chr>     <chr>                <dbl>
    #> 1 B0000000… 2008-03-10 Recruitm… MainMail              97.9
    #> 2 B0000000… 2008-02-19 Recruitm… MainMail             350. 
    #> 3 B0000000… 2008-02-25 Recruitm… MainMail             349. 
    #> # … with 8 more variables: campaignparentid <chr>,
    #> #   BrandAccount_Brand <chr>, recrtype <chr>, POA_CODE <fct>, `Recruitment
    #> #   Date` <date>, `1st Year Since Recruitment` <date>, `2nd Year Since
    #> #   Recruitment` <date>, `3rd Year Since Recruitment` <date>
    

    reprex package (v0.2.1) 于 2019 年 2 月 13 日创建

    between 中还有一个语法错误,尽管现在不相关:

    filter(salesdate %>% between(`Recruitment Date`, `1st Year Since Recruitment`))
    

    【讨论】:

    • 嘿,这是真的,我确实需要更正那里的语法,但它仍然返回错误:Error in filter_impl(.data, quo) : Evaluation error: Expecting a single value: [extent=3]..
    • 请提供您数据前几行的dput,以便我们重现问题
    • 没问题 - 添加到问题中,因为评论框太长了
    • 啊,我没有意识到 between 在其边界参数中没有向量化。更新答案
    • 啊,是 between 操作员挡住了路 - 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多