首页 > 解决方案 > 删除一列具有重复值的行,但仅当最新行具有另一列的特定值时

问题描述

考虑以下数据框

address <- c('9A Eagle Point N','9A Eagle Point N','9A Eagle Point N', '9999 Mineral Wells Highway', '9999 Mineral Wells Highway')
sale_status <- c('Succeeded', 'Failed', 'Failed', 'Failed', 'Failed')
sale_date <- as.Date(c('2020-03-01','2020-02-01', '2020-01-14', '2020-03-02', '2019-08-01'))
df = data.frame(address, sale_status, sale_date)

这样数据看起来像这样:

1           9A Eagle Point N   Succeeded 2020-03-01
2           9A Eagle Point N      Failed 2020-02-01
3           9A Eagle Point N      Failed 2020-01-14
4 9999 Mineral Wells Highway      Failed 2020-03-02
5 9999 Mineral Wells Highway      Failed 2019-08-01

我正在尝试编写代码,以便对于具有匹配地址的任意数量的 n 行,只要在倒数第二个最近的销售日期的 180 天内成功售出最新的行,就会删除较早的匹配(重复)行。我只希望在最新行具有sale_status“成功”(df$sale_status == "Succeeded)且较早的匹配行具有sale_status“失败”(df$sale_status == "Failed")时删除先前的匹配行

我知道这听起来令人难以置信的复杂,但任何帮助将不胜感激。我检查了其他几个已发布的问题,但似乎没有一个解决这个用例。

我相信生成的数据框将如下所示:

1           9A Eagle Point N   Succeeded 2020-03-01
4 9999 Mineral Wells Highway      Failed 2020-03-02
5 9999 Mineral Wells Highway      Failed 2019-08-01

标签: rduplicates

解决方案


这是lagfrom的一种方法dplyr

首先,我们用 计算每个地址的日期之间的天数差lag。然后,我们使用 计算从最终成功日期到过去的累积天数cumsum。然后我们过滤满足以下任一条件的行:

  1. 成功
  2. 从未卖过
  3. 销售成功前 180 多天失败
library(dplyr)
df %>%
  arrange(desc(sale_date)) %>%
  group_by(address) %>% 
  mutate(elapsed = sale_date - lag(sale_date,1L,default=first(sale_date)),
         cumelapse = cumsum(as.integer(elapsed)),
         sold = any(sale_status == "Succeeded")) %>%
  filter( sale_status == "Succeeded" | sold == FALSE | (sold == TRUE & cumelapse < -180)) %>%
  ungroup %>% arrange(address,sale_date)
#  address                    sale_status sale_date  elapsed   cumelapse sold 
#  <fct>                      <fct>       <date>     <drtn>        <int> <lgl>
#1 9999 Mineral Wells Highway Failed      2019-08-01 -214 days      -214 FALSE
#2 9999 Mineral Wells Highway Failed      2020-03-02    0 days         0 FALSE
#3 9A Eagle Point N           Succeeded   2020-03-01    0 days         0 TRUE 

推荐阅读