【问题标题】:Filtering dataset on closest date for multiple variables过滤多个变量的最接近日期的数据集
【发布时间】:2017-10-06 21:02:20
【问题描述】:

我正在处理每个受试者都有多个变量的数据,以及测量每个变量的日期。对每个受试者多次测量变量。

我有一个单独的文件,其中包含每个主题的“目标日期”。我想过滤原始数据集,并包含最接近每个主题的目标日期的唯一变量测量值。

这是一个简单的例子:

library(dplyr)

set.seed(1234)

data <- data.frame(dates = sample(seq(as.Date('1999/01/01'), 
as.Date('2010/01/01'), by="day"), 200), 
                   ids = rep(1:50, 2))
data <- arrange(data, ids)
data$vars <- rep(1:2, 100)

target.date <- data.frame(dates = sample(seq(as.Date('1999/01/01'), 
as.Date('2010/01/01'), by="day"), 50), 
                          ids = rep(1:50))

对于每个主题,有两个变量,每个变量都测量了两次。我只想包含与target.date 中日期最接近的每个变量的测量值。

我尝试像这样使用 dplyr:

data.sub <- data %>%
  group_by(id, vars) %>%

但我不确定如何继续,因为我必须以某种方式引用与每个ids 关联的target.date 中的日期。我还想在不超过目标日期的情况下选择最接近的日期,但对于我创建的这个示例中的某些主题可能无法实现。

这是我想要得到的输出的 sn-p:

       dates  ids  vars
1 2000-04-01    1     1
2 2003-08-26    1     2
3 2005-01-22    2     1
4 2002-05-13    2     2
.
.
.

对于主题 2,vars==1 的两个日期都在目标日期之后。但为了简单起见,我还是把它包括在内。但如果可能的话,我想选择最接近目标日期的日期,而不是越过它。

【问题讨论】:

    标签: r date dplyr


    【解决方案1】:

    这就是我认为你需要的。您的问题不是很清楚,并且您没有根据示例数据提供预期的输出。我可以根据您的反馈进行修改。

    data <- inner_join(data, target.date, by = 'ids')
    data$days <- difftime(data$dates.x, data$dates.y, units = 'days')
    data$days <- abs(as.integer(data$days))
    data %>%
      group_by(ids, vars) %>%
      filter(days == min(days)) %>%
      slice(1)
    

    【讨论】:

    • 我添加了一些示例输出,但您给出的答案正是我想要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多