r - 删除一列具有重复值的行,但仅当最新行具有另一列的特定值时
问题描述
考虑以下数据框
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
解决方案
这是lag
from的一种方法dplyr
。
首先,我们用 计算每个地址的日期之间的天数差lag
。然后,我们使用 计算从最终成功日期到过去的累积天数cumsum
。然后我们过滤满足以下任一条件的行:
- 成功
- 从未卖过
- 销售成功前 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
推荐阅读
- javascript - 将代码放在 Electron 应用程序中的什么位置以使 JavaScript 工作?
- windows - 无法从生产者向消费者发送消息
- java - ORA-01722 将值设置到数据库表中时
- laravel - Laravel,使用弹出警报
- android - gRPC Android 客户端失去连接“ping 太多”
- azure - 如何在 Application Insights 中区分来自不同实例 .net 核心应用程序的跟踪
- android - Trying to generate 11 characted hash String for SMS Retreiver API
- gremlin - Gremlin, 1-to-N relationship query issue
- c# - 是否有必要关闭/处置 SafeHandles
- r - R Spark 从文件夹中一次读取一个文件,与 Shiny 集成