如何从两个日期之间的数据集中选择行?

时间:2019-01-16 12:43:39

标签: r dplyr lubridate

我有一个很大的数据集(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包对我的数据进行排序。我已经尝试过filterselect,但都没有达到预期的效果。

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 :(得分:1)

要解决的问题很简单,因为实际上您可以过滤日期并比较多列中的日期。请尝试下面的代码,并确认自己可以正常运行。如果该方法不适用于您自己的数据集,请共享有关您的数据和处理的更多信息,因为您的代码中可能存在错误。 (我已经看到一个错误:您不能使用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)