【发布时间】:2024-01-17 08:59:01
【问题描述】:
在本网站的其他地方也有类似的问题,但没有一个答案包含我需要做的所有事情。
我有一个数据框,我正试图将其更改为时变数据。研究中的受试者可以从不治疗变为治疗,但不能反过来。受试者有多行治疗信息,我想找到第一次出现的治疗,这很简单。问题是并不是每个人都经历过这种治疗,因此每当我运行我的算法来寻找第一次发生的时候,这些人都会被删除。为了让我的问题更清楚:
ID treatment start.date stop.date
1 0 01/01/2002 01/02/2002
1 0 01/02/2002 01/03/2002
1 1 01/03/2002 01/04/2002
1 0 01/04/2002 01/05/2002
2 0 01/01/2002 01/02/2002
2 0 01/02/2002 01/03/2002
3 0 01/01/2002 01/02/2002
3 1 01/02/2002 01/03/2002
3 0 01/03/2002 01/04/2002
如您所见,2 从未接受过治疗。当我运行以下算法时,2 被删除。
data$keep <- with(data,
ave(treatment==1, ID ,FUN=function(x) if(1 %in% x) cumsum(x) else 2))
with(data, data[keep==0 | (treatment==1 & keep==1),])
有什么方法可以扩展此代码,以便它保留那些没有第一次出现的人并且保持每一行直到第一次出现的人有它?
总而言之,我希望我的数据如下所示:
ID treatment start.date stop.date
1 0 01/01/2002 01/02/2002
1 0 01/02/2002 01/03/2002
1 1 01/03/2002 01/04/2002
2 0 01/01/2002 01/02/2002
2 0 01/02/2002 01/03/2002
3 0 01/01/2002 01/02/2002
3 1 01/02/2002 01/03/2002
【问题讨论】:
-
鉴于您正在进行聚合,您真的应该学习使用
dplyr或data.table进行拆分-应用-组合。任何更少的东西都会很快耗尽,并且代码几乎是只写的;非常难以重用或理解。
标签: r aggregate find-occurrences