R-从差异小于30天的数据框中删除行

时间:2019-05-05 10:51:51

标签: r

我的数据框看起来像这样

df <- read.table(text="
                 id          nr      date
    1            124         1       2017-01-01
    2            122         1       2017-01-03
    3            124         2       2017-01-04
    4            121         1       2017-02-05
    5            124         3       2017-02-06
    6            124         3       2017-04-06
", header=TRUE)

我必须从我的数据框中删除行数(天差小于30天)。我通常使用Lead函数进行处理,然后以天为单位计算差异,如果该差异低于限制,则将其删除。

但是现在我要删除低于限制的每一行。不仅如此;如果其日期之间的日期差超过30天,那么我必须过滤所有低于限制的下一行。

换句话说,有第一行,应该删除行号2和3,因为日期差只有几天。第4行与第1行之间的差异超过30天,因此不应删除;第4行与第5行之间的差异小于30天,因此应将其删除,由于差异超过30天,因此结果中应存在6。上。

2 个答案:

答案 0 :(得分:3)

也许有更简单的算法,但是这个算法可以做到。

remove_dates <- function(DF, col = "date", lim = 30){
  n <- nrow(DF)
  log_inx <- !logical(n)
  i <- 1
  j <- 2
  while(i < n & j <= n){
    d <- difftime(DF[j, col], DF[i, col], unit = "days")
    if(d < lim){
      log_inx[j] <- FALSE
      j <- j + 1
    }else{
      i <- j
      j <- j + 1
    }
  }
  DF[log_inx, ]
}

remove_dates(df)
#   id nr       date
#1 124  1 2017-01-01
#4 121  1 2017-02-05
#6 124  3 2017-04-06

请注意,以上功能可以在magrittr%>%管道中使用。

library(dplyr)

df %>% remove_dates()
#   id nr       date
#1 124  1 2017-01-01
#4 121  1 2017-02-05
#6 124  3 2017-04-06

答案 1 :(得分:0)

使用dplyr方法:

df <- read.table(text="
                 id          nr      date
    1            124         1       2017-01-01
    2            122         1       2017-01-03
    3            124         2       2017-01-04
    4            121         1       2017-02-05
    5            124         3       2017-02-06
    6            124         3       2017-04-06
", header=TRUE)

df$date <- as.Date(df$date)

library(dplyr)

df %>%
    mutate(tmp = lag(date)) %>%
    filter(date - tmp > 30 | date == first(date)) %>%
    select(-tmp)

#    id nr       date
# 1 124  1 2017-01-01
# 2 121  1 2017-02-05
# 3 124  3 2017-04-06