【问题标题】:How to select rows from a dataset between two dates?如何从两个日期之间的数据集中选择行?
【发布时间】:2019-01-16 12:43:39
【问题描述】:

我有一个相当大的数据集(35 个变量和 65 000 行),我想将它分成三个特定日期。我有关于动物手术前后的信息。我目前正在使用dplyr 包。下面我展示了我的数据集的样子,我只是举了一个例子,因为在我的 datasetdput 上使用时,我得到了一些非常大且不可读的东西。就像在示例中一样,我有几个对个人进行测量的日期。有关个人的信息由每个人唯一的手术日期完成。至于多年来进行的示例测量。

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 天(但我会在后面处理这一天),第三天将涵盖手术后采取的措施。

【问题讨论】:

  • 你还能分享dput的输出吗?这样可以更轻松地重现您的示例。
  • 你的问题信息量太大,一句话你的终极目标是什么?也许在您的问题中加粗
  • @A. Stam:dput 太大而无法共享,即使在我尝试通过删除一些列来减小它的大小之后……@NelsonGon:很抱歉如此不精确。我想有,分成三个不同时期的数据集。第一个将涵盖手术前采取的所有措施,第二个将涵盖手术当天+ 5 天(但我会在后面处理这个),第三个将涵盖手术后采取的措施。跨度>

标签: r dplyr lubridate


【解决方案1】:

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

【讨论】:

  • 这基本上是我在无法弄清楚为什么它之前没有给我任何结果之前所做的事情。但是,我一定做错了什么,因为现在它正在工作!非常感谢您的时间和帮助(:
猜你喜欢
  • 2012-12-21
  • 2012-10-31
  • 2012-03-03
  • 2018-10-31
  • 2020-04-29
  • 2012-01-17
  • 1970-01-01
  • 2017-03-07
  • 2015-06-04
相关资源
最近更新 更多