在我的数据框中,我有一列“日期”,我希望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天内没有其他日期。
任何帮助将不胜感激!
答案 0 :(得分:2)
使用一些order
和diff
来实现
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)
这是使用lubridate
和dplyr
的冗长方式。
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"