彼此相隔4年的子集数据记录?

时间:2018-01-04 21:04:17

标签: r

我希望保留在网站内任何其他记录的4年内的行。 例如,这是一个包含“站点”字段和“日期”字段的表,其中包含要删除的记录。

我一直在尝试滚动连接,但是我对这些网站的移动窗口有困难。

    ex_dates<-read.csv(text=getURL("https://raw.githubusercontent.com/sregalado/Reg1/master/ex_dates.csv"), header=T)
    #Data
    ex_dates
    #   ID   SITE      Date
    #1   1 500001  9/4/2008 ###REMOVE
    #2   2 500001  9/5/2013
    #3   3 500001  9/6/2013
    #4   4 500001  9/7/2014
    #5   5 500001  9/4/2014
    #6   6 500001  9/5/2015
    #7   7 500001  9/6/2017
    #8   8 500001  9/7/2017
    #9   9 500002  9/4/2005 ###REMOVE
    #10 10 500002  9/6/2012
    #11 11 500002  9/7/2014
    #12 12 500002  9/4/2014
    #13 13 500002  9/5/2015
    #14 14 500003  9/5/2012
    #15 15 500003  9/6/2012
    #16 16 500003  9/7/2012
    #17 17 500003  9/8/2012
    #18 18 500003  9/9/2012
    #19 19 500003 9/10/2012
    #20 20 500003  9/7/2014
    #21 21 500003  9/4/2014
    #22 22 500003  9/5/2015

1 个答案:

答案 0 :(得分:0)

此解决方案利用了一些data.table。此处的目标是按SITE分组,然后在组中的目标之间检查每个日期与组中所有其他日期的差异。如果所有其他日期超过yearDiff阈值,则将记录标记为TRUE。然后,您可以在该字段上进行子集化。

library(data.table)

exDates <- fread("https://raw.githubusercontent.com/sregalado/Reg1/master/ex_dates.csv")
exDates[,Date:=as.Date(Date, format = "%m/%d/%Y")]

findRemoveByYearDiff <- function(dates, yearDiff){
    sapply(seq(length(dates)), function(x) all(abs(dates[x] - dates[-x]) > (365.25 * yearDiff)))
}

exDates[,rmRecord:=findRemoveByYearDiff(Date, 4), by = SITE]

exDates <- exDates[rmRecord != TRUE,]