Как выбрать строки из набора данных между двумя датами? - PullRequest
0 голосов
/ 16 января 2019

У меня довольно большой набор данных (35 переменных и 65 000 строк), и я хотел бы разбить его на три в отношении конкретных дат. У меня есть информация о животных до и после операции. В настоящее время я использую пакет dplyr. Ниже я представляю, как выглядит мой набор данных, просто приведу пример, потому что при использовании в моем наборе данных dput я получаю нечто действительно большое и нечитаемое. Как и в примере, у меня есть несколько дат, в которые измерения проводились для человека. Информация о человеке заполняется до даты операции, которая является уникальной для каждого человека. Что касается примера измерений, которые проводились в течение нескольких лет.

Name           Date    Measurement    Surgery_date
Pierre     2016-03-15     5.12         2017-03-21
Pierre     2017-03-16     4.16         2017-03-21
Pierre     2017-08-09     5.08         2017-03-21
Paul       2016-07-03     5.47         2017-03-25
Paul       2016-09-30     4.98         2017-03-25
Paul       2017-04-12     4.51         2017-03-25

На данный момент мне не помешало иметь формат даты для дат измерения и для дат операции, используя пакет lubridate. Затем я попытался, используя пакет dplyr для сортировки моих данных. Я пробовал filter и select, но ни один из них не дал ожидаемых результатов.

data1$Date <- parse_date_time(data1$Date, "d/m/y")
data1$Date <- ymd(data1$Date)
data1$Surgery_date <- parse_date_time(data1$Surgery_date, "d/m/y")
data1$Surgery_date <- ymd(data1$Surgery_date)

before_surgery <- data1
before_surgery <- dplyr::as_tibble(before_surgery)
before_surgery <- before_surgery %>%
    filter(Date > Surgery_date)

before_surgery <- before_surgery %>%
    select(Date < Surgery_date)

В любом случае ни одна строка не удаляется. Когда я пытаюсь (по тем же значениям) получить даты после операции, строка фактически не выбирается.

Я проверил свой файл, чтобы убедиться, что на самом деле есть даты после и до даты операции (если бы этот результат не был нормальным), и я могу подтвердить, что в наборе данных есть два вида дат.

Я только что привел здесь пример дат до операции, предполагая, что он работает по той же схеме, что и даты после операции.

Заранее благодарю тех, кто найдет время, чтобы прочитать меня. Извините, если вопрос очень похож на другие, но я не смог найти решение самостоятельно ...

РЕДАКТИРОВАТЬ: Чтобы быть более точным, конечная цель - иметь три отдельных набора данных. Первый будет охватывать все меры, принятые до операции , второй день дня Сама операция + 5 дней (но я постараюсь справиться с последним), а третий будет охватывать мер, предпринятых после операции.

1 Ответ

0 голосов
/ 16 января 2019

Решение того, что вы спрашиваете, простое, потому что вы можете фильтровать даты и сравнивать даты в нескольких столбцах. Пожалуйста, попробуйте код ниже и подтвердите для себя, что это работает так, как вы ожидаете. Если этот подход не работает с вашим собственным набором данных, пожалуйста, поделитесь более подробной информацией о ваших данных и обработке, поскольку в вашем коде, вероятно, есть ошибка. (Одна ошибка, которую я уже видел: вы не можете использовать select(Date < Surgery_date). Вам нужно использовать filter).

Вот как бы я подошел к вашей проблеме. Как видите, код очень прост.

df <- data.frame(
  Name = c(rep('Pierre', 3), rep('Paul', 3)),
  Date = c('2016-03-15', '2017-03-26', '2017-08-09', '2016-07-03', '2016-09-30', '2017-04-12'),
  Measurement = c(5.12, 4.16, 5.08, 5.47, 4.98, 4.51),
  Surgery_date = c(rep('2017-03-21', 3), rep('2017-03-25', 3))
) %>%
  mutate(Surgery_date = ymd(Surgery_date),
         Date = ymd(Date))

df %>%
  filter(Date < Surgery_date)

df %>%
  filter(Date > Surgery_date & Date < (Surgery_date + days(5)))

df %>%
  filter(Date > Surgery_date)
...