R:如何在 data.table 中标记特定时间范围内的观察结果?
Posted
技术标签:
【中文标题】R:如何在 data.table 中标记特定时间范围内的观察结果?【英文标题】:R: How to flag observations within a certain timeframe in data.table? 【发布时间】:2022-01-08 02:48:16 【问题描述】:我正在使用类似于下面的大型数据框。我想通过 ID 标记所有在 30 天前有观察结果的观察结果。我最初一直试图做一个模糊连接来实现这一点,但似乎无法确定我在 data.table 上哪里出错了。有什么建议吗?
library(tidyverse)
library(magrittr)
library(data.table)
df<-tibble(
date=sample(seq(as.Date('1999/01/01'), as.Date('1999/06/01'), by="day"), 300,replace=T),
id=sample(seq(1:3),300,replace=T),claim_id=1:300)
df%<>%data.table()
df_index<-df
df_readmit<-df
names(df_index)[c(1,3)]<-c("index_date","index_id")
names(df_readmit)[c(1,3)]<-c("readmit_date","readmit_id")
df_readmit[df_index,.(id,index_date,readmit_date,index_id,readmit_id),
on=.(id,readmit_date>index_date),nomatch=0]
【问题讨论】:
您能否澄清一下您所说的标志和您所说的提前 30 天进行观察。这是否意味着比后来的观察早 30 天的观察? @sindri_baldur 具体来说,如果某个 ID 有观察,则创建一个新行,指示该 ID 在 30 天前是否有观察。对于在 30 天内进行过观察的个人,我想删除任何观察结果。 所有观察在 30 天内有另一个(相同的id
)(除了每个id
的第一行,即) .
在提出问题时要考虑这一点。假设一个 ID 在第 1 天、第 27 天、第 38 天、第 67 天有一个观察结果……如何决定排除哪个?例如,一旦决定包括第 1 天,就必须排除第 27 天,包括第 38 天,并排除第 67 天。另一方面,可以包括第 27 天和第 67 天,......这可能会产生巨大的差异如果您从最近的开始并向后工作 - 与从最旧的开始并继续工作相比。
【参考方案1】:
如果顺序可以更改,那么我建议我们只看日期的diff
。
library(data.table)
setorder(df, date)
df[,.SD[c(TRUE, diff(date) > 30),], by = id]
# id date claim_id
# <int> <Date> <int>
# 1: 1 1999-01-01 231
# 2: 2 1999-01-02 284
# 3: 3 1999-01-03 78
在这种情况下,因为跨越 6 个月的 100 天不太可能有 30 天的跨度保持不变,所以没有任何样本数据出现这种情况。但是,也许该方法适用于您的真实数据。
【讨论】:
以上是关于R:如何在 data.table 中标记特定时间范围内的观察结果?的主要内容,如果未能解决你的问题,请参考以下文章
在 R data.table 中,如何将变量参数传递给表达式?
如何在 R 中迭代地过滤列表中的列表或如何同时使用两个条件过滤 data.table,在运行时创建对象