【问题标题】:R: How to filter a dataset on multiple conditionsR:如何在多个条件下过滤数据集
【发布时间】:2021-03-11 09:01:05
【问题描述】:

我有一个由三个变量组成的数据集:“customer_ID”、“date”、“Purchase_amount”。

如果唯一 customer_ID 出现在指定日期之后,我需要对数据集应用过滤器以删除它们。

我在想这样的事情:filter(df, !unique(customer_ID) & date>=2019-12-31) 或者If() 函数更适合这里。

我应该怎么做?

----编辑----

上下文是我正在尝试进行 CLV 分析,这需要我将数据集拆分为估计期和保持期。上述数据集中的每个观察值都代表客户在给定日期以给定金额进行的交易。同一客户可以多次购买,这只会导致客户 ID 显示多次。为了进行分析,我需要从保留期中删除所有新获取的客户,因为我只对起始客户组感兴趣,看看有多少客户在估计期间决定再次购买在保留期内。

为了说明问题,我创建了一些模型数据:

ID=c(1,2,3,1,3,4)
date=c('2020-01-01','2020-01-05','2020-01-19','2020-02-03','2020-02-14','2020-02-21')
purchase_amount=c(24,20,19,30,22,24)
data.frame(ID,date,purchase_amount)

我想创建一个过滤器,用于删除包含 2020 年 1 月 31 日之后出现的唯一 customer_ID 的每个观察。在本例中,这意味着 customer_ID 为 4 的客户将被删除.请记住,即使 customer_ID 2 是唯一的,交易也不会在指定日期之后发生,因此不应将其删除。

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以用dplyr试试这个:

    library(dplyr)
    
    df %>%
      mutate(date = as.Date(date)) %>%
      group_by(ID) %>%
      filter(!all(date > as.Date('2020-01-31'))) %>%
      ungroup -> result
    
    result
    
    #     ID date       purchase_amount
    #  <dbl> <date>               <dbl>
    #1     1 2020-01-01              24
    #2     2 2020-01-05              20
    #3     3 2020-01-19              19
    #4     1 2020-02-03              30
    #5     3 2020-02-14              22
    

    这将删除IDall 条目位于'2020-01-31' 之后。

    【讨论】:

    • 这样就可以了。谢谢!
    【解决方案2】:

    类似于 Ronaks 解决方案,但多了一列: 检查 case_when 以获取包含 2020-01-31 之后发生的唯一 customer_ID 的观察,然后 filter.

    # your data
    ID=c(1,2,3,1,3,4)
    date=c('2020-01-01','2020-01-05','2020-01-19','2020-02-03','2020-02-14','2020-02-21')
    purchase_amount=c(24,20,19,30,22,24)
    df <- data.frame(ID,date,purchase_amount)
    
    df1 <- df %>% 
      mutate(date = as.Date(date)) %>%
      group_by(ID) %>% 
      mutate(logical = case_when(n() == 1 & date > as.Date('2020-01-31') ~ TRUE,
                                  TRUE ~ FALSE)) %>% 
      filter(logical == FALSE)
    
    # Output:
         ID date       purchase_amount logical
      <dbl> <date>               <dbl> <lgl>  
    1     1 2020-01-01              24 FALSE  
    2     2 2020-01-05              20 FALSE  
    3     3 2020-01-19              19 FALSE  
    4     1 2020-02-03              30 FALSE  
    5     3 2020-02-14              22 FALSE  
    

    【讨论】:

      猜你喜欢
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 2014-10-22
      相关资源
      最近更新 更多