我有一个每天重复测量的数据(如血糖监测仪)。每个人都可以在一段时间内佩戴该设备,因此一个人可以重复测量1周,其他人可以重复测量6个月。然后每个人都会有一个带有访视日期的列。有些人可以有一次以上的访视(最多3次访视)。
我的数据看起来像这样(抱歉,但我不知道如何生成模拟数据)
datos
id visit_Date time value
1 2020-03-06 2022-03-23 17:09:00 10
1 2020-03-06 2022-03-23 17:14:00 11
1 2020-03-06 2022-03-23 17:19:00 11
1 2020-03-06 2022-03-23 17:24:00 12
1 2020-03-06 2022-03-23 17:29:00 11
2 2018-03-30 2022-03-24 17:22:00 13
2 2018-03-30 2022-03-24 17:27:00 10
2 2018-03-30 2022-03-24 17:32:00 11
2 2018-03-30 2022-03-24 17:37:00 12
字符串
有些人可以在visit_Date
之前佩戴监测设备,有些人只能在visit_Date
之后佩戴监测设备。我需要的是提取id, visit_Date
,time
,和value
,间隔10天,但最接近visit_Date
。理想情况下应在访视日期之后但有些人在就诊后佩戴的时间不够长,那么visit_Date
重叠的间隔就可以了。
到目前为止,我所做的是通过按id
和visit_Date
分组,按time
降序排列,然后按time + 10 days
过滤来获得最接近的日期。下面是我使用的代码:
library(lubridate)
datos %>%
dplyr::filter(time >= visit_Date) %>%
group_by(id, visit_Date) %>%
arrange(desc(time)) %>%
dplyr::filter(time < time + 10) %>%
summarise(min = min(time), max = max(time))
型
我正在使用summarise查看过滤后总共有多少天,但是这种过滤仅适用于访问日期后的time
,并且有些人在访问后10天内没有佩戴设备。我想我可以对那些少于10天的人重复相同的过滤过程**time <= visit_Date
**,然后合并两个数据集,但我想知道是否有另一种方法来完成它
编辑
我想要的输出将是每个人的所有行,其中10个间隔天最接近visit_Date
,理想情况下在visit_Date
之后,但如果不重叠visit_Date
。这里是一个示例输出(请记住,我的真实的日期在time
列中每5分钟有一个数据点。
期望输出(以2个人为例)
> datos
id visit_Date time value
1 2020-03-06 2022-02-22 17:09:00 10
1 2020-03-06 2022-02-26 17:09:00 10
1 2020-03-06 2022-02-26 17:14:00 11
1 2020-03-06 2022-02-28 17:19:00 11
1 2020-03-06 2022-03-07 17:24:00 12
1 2020-03-06 2022-03-07 17:29:00 11
2 2018-03-30 2022-03-24 17:22:00 13
2 2018-03-30 2022-03-30 17:27:00 10
2 2018-03-30 2022-04-10 17:32:00 11
2 2018-03-30 2022-04-24 17:37:00 12
2 2018-03-30 2022-04-26 17:37:00 12
# Desired output
id visit_Date time value
1 2020-03-06 2022-02-26 17:09:00 10
1 2020-03-06 2022-02-26 17:14:00 11
1 2020-03-06 2022-02-28 17:19:00 11
1 2020-03-06 2022-03-07 17:24:00 12
1 2020-03-06 2022-03-07 17:29:00 11
2 2018-03-30 2022-03-30 17:27:00 10
2 2018-03-30 2022-04-10 17:32:00 11
型
在这个例子中,个人 * id 1 * 在访问日期之后没有佩戴设备超过10天,因此,输出应包括访视前的日期,但仅包括最接近visit_Date
的10天间隔。在 id2 的情况下,个人在visit_Date
之后佩戴设备超过10天,我们选择最接近visit_Date
但在visit_Date
之后或等于visit_Date
的10天
谢谢
2条答案
按热度按时间mzsu5hc01#
对于一个 id,我们可以检查
difftime
与visit_date
之间的距离是否超过10天。如果是这样,我们可以很容易地用那些TRUE
的值进行子集划分。否则,相反地,我们可以对大于负10天的差异进行子集划分。字符串
更新
如果你想把
by
的 id 和 visit_Date 都分组,你要找的是interaction
。型
2022年随机日期的模拟数据,加上12天并随机减去3,0或12天。在示例数据中保留
u
列用于定向。为了简洁起见,我使用12小时而不是5分钟间隔。型
给
型
cwxwcias2#
这里有一个data.table的解决方案,我没有得到相同的答案,因为你的问题中有一些不一致的地方,但是如果你能稍微澄清一下如何思考时间,这是很容易改变的。
字符串
首先计算时间和访问日期之间的时间差(以天为单位)。
型
然后计算每人最后一次访问日期后的最长时间。
型
这允许您确定在访问后10天内没有跟踪他们的情况下需要多少缓冲时间。
pmin()
在这里将没有负缓冲时间的天数替换为零。型
然后你选择那些符合你要求的测量值,它们必须不超过未来10天,并且不能超过剩余的向后缓冲区。
型