比较R中的相邻行

时间:2019-05-22 22:13:33

标签: r loops date comparison row

在我的数据框中,我有一列“日期”,我希望R遍历循环中的每一行日期,以查看该日期之前或之后的日期是否在3-14天范围内,以及不是,它索引到要在循环结束时删除的列表。

例如:

my_dates <- c( "1/4/2019", "1/18/2019", "4/3/2019", "2/20/2019", "4/5/2019")

我想删除包含2/20/2019的整个行,因为在该日期的3-14天内没有其他日期。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

使用一些orderdiff来实现

my_dates <- c( "1/4/2019", "1/18/2019", "4/3/2019", "2/20/2019", "4/5/2019")
my_dates <- as.Date(my_dates, format="%m/%d/%Y")

o <- order(my_dates)
d <- abs(diff(my_dates[o]))

my_dates[o[ c(Inf,d) <= 14 | c(d,Inf) <= 14 ]]
#[1] "2019-01-04" "2019-01-18" "2019-04-03" "2019-04-05"

答案 1 :(得分:1)

这是使用lubridatedplyr的冗长方式。

my_dates <- c( "1/4/2019", "1/18/2019", "4/3/2019", "2/20/2019", "4/5/2019")

library(lubridate); library(dplyr)
df <- data.frame(dates = mdy(my_dates)) %>%
  arrange(dates) %>%
  mutate(days_prior  = dates - lag(dates),
         days_before = lead(dates) - dates) %>%
  mutate(closest_day = pmin(days_prior, days_before, na.rm = T)) %>%
  filter(closest_day <= 14)

答案 2 :(得分:1)

这是来自outer的一种方法,来自thelatemail的数据

s=abs(-outer(my_dates, my_dates, '-'))
my_dates[rowSums(s<=14)>1]
[1] "2019-01-04" "2019-01-18" "2019-04-03" "2019-04-05"