如何移除DataFrame中同model和powertrain下被包含的时间范围行
解决方案
核心思路
不用生成完整年份列表,直接通过区间边界比较判断是否被包含,同时严格限定在model和powertrain分组内检查,既高效又逻辑准确。
代码实现
# 先加载dplyr包(未安装的话先运行 install.packages("dplyr")) library(dplyr) # 假设你的原始数据框名为df df <- tibble( model = c("car1", "car1", "car1", "car1", "car2", "car2"), powertrain = c("diesel", "diesel", "electric", "diesel", "electric", "electric"), start_year = c(2010, 2011, 2010, 2015, 2012, 2010), end_year = c(2015, 2013, 2015, 2017, 2013, 2017) ) # 过滤被包含的行 result_df <- df %>% group_by(model, powertrain) %>% filter( !row_number() %in% which( sapply(1:n(), function(i) { any( (start_year <= start_year[i]) & (end_year >= end_year[i]) & !(start_year == start_year[i] & end_year == end_year[i]) ) }) ) ) %>% ungroup() # 查看最终结果 print(result_df)
代码说明
- 分组限定:按
model和powertrain分组,确保只在同车型同动力系统的范围内检查区间包含关系,避免跨组误判。 - 区间判断逻辑:对每一行
i,检查组内是否存在其他行满足:- 其他行的起始年份 ≤ 当前行起始年份
- 其他行的结束年份 ≥ 当前行结束年份
- 两行区间不完全一致(防止误删和自身完全相同的行)
- 过滤操作:移除所有被同组其他区间完全包含的行,保留未被包含的有效行。
最终结果
运行后会保留以下行:
| model | powertrain | start_year | end_year |
|---|---|---|---|
| car1 | diesel | 2010 | 2015 |
| car1 | electric | 2010 | 2015 |
| car1 | diesel | 2015 | 2017 |
| car2 | electric | 2010 | 2017 |
内容的提问来源于stack exchange,提问作者rösti23
相关产品推荐
相关产品推荐

