如何从R中具有重复的开始和结束日期的数据框中删除行

山姆·吉尔伯特

我想从开始日期和结束日期重叠的数据框中删除产品,以避免在后续步骤中重复。

示例数据:

library(dplyr)

d <-
  bind_rows(
    data.frame(product = 1, 
               start_date = as.Date("2016-01-01"), 
               end_date = as.Date("2016-01-10"), 
               stringsAsFactors = FALSE),
    data.frame(product = 1, 
               start_date = as.Date("2016-01-02"), 
               end_date = as.Date("2016-01-04"), 
               stringsAsFactors = FALSE),
    data.frame(product = 1, 
               start_date = as.Date("2016-01-05"), 
               end_date = as.Date("2016-06-09"), 
               stringsAsFactors = FALSE),
    data.frame(product = 2, 
               start_date = as.Date("2016-01-03"), 
               end_date = as.Date("2016-01-07"), 
               stringsAsFactors = FALSE)  
    )

  product start_date   end_date
1       1 2016-01-01 2016-01-10
2       1 2016-01-02 2016-01-04
3       1 2016-01-05 2016-06-09
4       2 2016-01-03 2016-01-07

由于重叠,我想从此示例中删除第2行和第3行。

我使用了lag函数来移除彼此相邻的重叠:

d_cleaned <-
  d %>%
  arrange(product, start_date, end_date) %>%
  mutate(overlapping = product == lag(product) & start_date <= lag(end_date) & end_date >= lag(start_date)) %>% # define overlaps
  mutate(overlapping = ifelse(is.na(overlapping), FALSE, overlapping)) %>% # dont delete the first row
  filter(overlapping == FALSE) %>% # remove overlaps
  select(-overlapping)

  product start_date   end_date
1       1 2016-01-01 2016-01-10
2       1 2016-01-05 2016-06-09
3       2 2016-01-03 2016-01-07

从上面可以看出,该步骤将除去连续行上的重叠,但不是全部。

我可以通过循环来解决此问题,但我希望有人可以提出非循环解决方案,因为数据帧很大,而且每个步骤都需要一段时间。

阿伦

使用non-equi来自当前data.tablev1.9.7开发版本的联接:

require(data.table) # v1.9.7+
setDT(d) # convert 'd' to a data.table by reference
idx = d[d, on=.(product, end_date>=start_date, start_date<=end_date), mult="first", which=TRUE]
d[idx == seq_len(.N)] # .N contains the number of rows = nrow(d)
#    product start_date   end_date
# 1:       1 2016-01-01 2016-01-10
# 2:       1 2016-06-10 2016-06-12
# 3:       2 2016-01-03 2016-01-07

对于每一行d(方括号内的一个),我们发现任何与样重叠的d(在外面),即,自连接,基于提供给所述的条件on参数,我们提取索引的的第一重叠(因为which=TRUEmult="first")。

当且仅当第一个重叠与自身重叠时,我们才将它们返回。我们丢弃所有其他间隔。

要安装devel版本,请参阅此处的安装说明


这是更多行的基准(数据绝对不是很大):

set.seed(1L)
require(data.table) # v1.9.7+
dates = as.Date(sample(16000:17000, 1e5, TRUE), origin="1970-01-01")
dt = data.table(product=sample(100, 1e5, TRUE), 
                start_date = sample(dates, 1e5, TRUE), 
                end_date = sample(dates, 1e5, TRUE))
dt[, `:=`(start_date = pmin(start_date, end_date), 
          end_date   = pmax(start_date, end_date))]

system.time({
    idx = dt[dt, on=.(product, end_date>=start_date, start_date<=end_date), mult="first", which=TRUE, verbose=TRUE]
    ans = dt[idx == seq_len(.N)] # .N contains the number of rows = nrow(d)
})
# Non-equi join operators detected ... 
#   forder took ... 0.01 secs
#   Generating group lengths ... done in 0 secs
#   Generating non-equi group ids ... done in 0.041 secs
#   Recomputing forder with non-equi ids ... done in 0.005 secs
#   Found 178 non-equi group(s) ...
# Starting bmerge ...done in 2.359 secs

#    user  system elapsed 
#   2.402   0.011   2.421 

head(ans)
#    product start_date   end_date
# 1:      71 2015-12-04 2016-03-22
# 2:      71 2014-04-12 2015-05-01
# 3:      32 2013-11-23 2015-03-18
# 4:      56 2014-07-29 2015-12-26
# 5:      88 2015-03-08 2015-03-21
# 6:      69 2014-10-31 2015-07-05

nrow(ans)
# [1] 186

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何删除熊猫数据框中具有重复的行?

来自分类Dev

我如何从数据框中删除具有重复/重复索引的行

来自分类Dev

删除具有多列的数据框中的重复行

来自分类Dev

删除数据框(R)所有列中具有重复值的行

来自分类Dev

如何在tfs中创建具有开始日期和结束日期的任务?

来自分类Dev

查询以从仅具有开始日期的表中获取开始和结束日期

来自分类Dev

使用SQL Server中不同记录的开始日期和结束日期创建具有数据范围的临时表

来自分类Dev

如何计算具有两个向量(开始日期和结束日期)和日期向量的数据框之间匹配的天数?

来自分类Dev

在数据框中为具有不同开始日期的ID生成每日行

来自分类Dev

如何使用具有开始和结束日期的数据集添加日期?

来自分类Dev

按日期/时间从r中两个数据框的合并中删除重复的行

来自分类Dev

从pyspark数据框中删除具有相同值但在不同列中的重复行

来自分类Dev

Python:具有开始日期和结束日期的数据框,解压缩为1个日期字段

来自分类Dev

如何根据不同数据帧中的开始日期和结束日期从时间序列中提取数据?

来自分类Dev

在熊猫数据框中,如何根据满足不同条件的开始行和结束行过滤一组行?

来自分类Dev

删除多索引数据框中具有重复索引的行

来自分类Dev

根据具有列表值的多列删除数据框中的重复行

来自分类Dev

从R中的数据框中删除重复的行

来自分类Dev

从R中的数据框中删除重复的行

来自分类Dev

从R中的数据帧中删除重复的行,使那些行具有较小/较大的值

来自分类Dev

从R中的数据帧中删除重复的行,使那些行具有较小/较大的值

来自分类Dev

由数据框中的列定义的时间段的开始和结束日期

来自分类Dev

在大数据框中剥离间隔的(不一致的)开始和结束日期

来自分类Dev

Excel VBA:如何从单元格中删除子字符串(具有相同的开始和结束符号)?

来自分类Dev

删除具有特定日期时间值的 Pandas 数据框中的某些行

来自分类Dev

如何删除数据框中具有重复值的列?

来自分类Dev

如果特定行在python的数据框中具有重复值,如何删除整列

来自分类Dev

如何过滤数组mongoose和nodejs中的数据开始日期结束日期基础

来自分类Dev

如何在给定的开始日期和结束日期之间的数组中添加缺失的数据条目

Related 相关文章

  1. 1

    如何删除熊猫数据框中具有重复的行?

  2. 2

    我如何从数据框中删除具有重复/重复索引的行

  3. 3

    删除具有多列的数据框中的重复行

  4. 4

    删除数据框(R)所有列中具有重复值的行

  5. 5

    如何在tfs中创建具有开始日期和结束日期的任务?

  6. 6

    查询以从仅具有开始日期的表中获取开始和结束日期

  7. 7

    使用SQL Server中不同记录的开始日期和结束日期创建具有数据范围的临时表

  8. 8

    如何计算具有两个向量(开始日期和结束日期)和日期向量的数据框之间匹配的天数?

  9. 9

    在数据框中为具有不同开始日期的ID生成每日行

  10. 10

    如何使用具有开始和结束日期的数据集添加日期?

  11. 11

    按日期/时间从r中两个数据框的合并中删除重复的行

  12. 12

    从pyspark数据框中删除具有相同值但在不同列中的重复行

  13. 13

    Python:具有开始日期和结束日期的数据框,解压缩为1个日期字段

  14. 14

    如何根据不同数据帧中的开始日期和结束日期从时间序列中提取数据?

  15. 15

    在熊猫数据框中,如何根据满足不同条件的开始行和结束行过滤一组行?

  16. 16

    删除多索引数据框中具有重复索引的行

  17. 17

    根据具有列表值的多列删除数据框中的重复行

  18. 18

    从R中的数据框中删除重复的行

  19. 19

    从R中的数据框中删除重复的行

  20. 20

    从R中的数据帧中删除重复的行,使那些行具有较小/较大的值

  21. 21

    从R中的数据帧中删除重复的行,使那些行具有较小/较大的值

  22. 22

    由数据框中的列定义的时间段的开始和结束日期

  23. 23

    在大数据框中剥离间隔的(不一致的)开始和结束日期

  24. 24

    Excel VBA:如何从单元格中删除子字符串(具有相同的开始和结束符号)?

  25. 25

    删除具有特定日期时间值的 Pandas 数据框中的某些行

  26. 26

    如何删除数据框中具有重复值的列?

  27. 27

    如果特定行在python的数据框中具有重复值,如何删除整列

  28. 28

    如何过滤数组mongoose和nodejs中的数据开始日期结束日期基础

  29. 29

    如何在给定的开始日期和结束日期之间的数组中添加缺失的数据条目

热门标签

归档