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 中,如何将变量参数传递给表达式?

如何计算 R 中 data.table 中的出现组合

如何在 R 中迭代地过滤列表中的列表或如何同时使用两个条件过滤 data.table,在运行时创建对象

R语言data.table导入数据实战: .N函数和.I函数使用.N函数返回行数使用.I函数返回满足特定条件行的索引

R data.table 从剪贴板读取