R - удалить строки из фрейма данных, если разница меньше 30 дней - PullRequest
3 голосов
/ 05 мая 2019

Мой фрейм данных выглядит следующим образом

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 дней.Я обычно делаю это с помощью функции отведения, затем вычисляю разницу в днях, и если она ниже предела, я ее убираю.

Но теперь я хочу удалить каждую строку, которая ниже предела.И не только это;если разница дат между датой превышает 30 дней, то мне придется отфильтровать все последующие строки, которые находятся ниже предела.

Другими словами, есть первая строка, номера строк 2 и 3 должны быть удалены, поскольку разница в датах составляет всего несколько дней.Разница между строкой 4 и первой составляет более 30 дней, поэтому ее не следует удалять, разница между строками 4 и 5 составляет менее 30 дней, поэтому удалите ее, 6 должно присутствовать в результате, поскольку разница составляет более 30 дней и т. Д.на.

Ответы [ 2 ]

3 голосов
/ 05 мая 2019

Возможно, есть более простые алгоритмы, но этот делает это.

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 pipe, %>%.

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
0 голосов
/ 05 мая 2019

Использование подхода 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...