在多种条件下结转的最后观察结果

时间:2019-11-28 13:06:37

标签: r data-manipulation locf

我有一个面板数据框,其中有很多看起来像这样的缺失值。

ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
date = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
Treatment= c("A", NA , "B", "-A",NA, NA, "D", NA,"-D", NA, "F", NA, "G",NA,NA)
cond = c(0,0,0,1,0,0,0,0,1,0,0,0,0,0,0)
base_tr = c("A", NA , "B", "A",NA, NA, "D", NA,"D", NA, "F", NA, "G",NA,NA)
var = c(1, NA , 2, 0,NA, NA, 3, NA,0, NA, 2, NA, 1,NA,NA)
df = data.frame(ID, date,Treatment,base_tr,cond,var)

我想获得以下数据集:

ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
date = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
Treatment= c("A", NA , "B", "-A",NA, NA, "D", NA,"-D", NA, "F1", NA, "F2",NA,NA)
base_tr = c("A", NA , "B", "A",NA, NA, "D", NA,"D", NA, "F", NA, "F",NA,NA)
cond = c(0,0,0,1,0,0,0,0,1,0,0,0,0,0,0)
var = c(1, 1 , 2, 2, 2, NA, 3, 3, 0, 0,2,2,2,2,2)
final = data.frame(ID, date,Treatment,base_tr,cond,var)

按照以下逻辑创建数据集:

1)总的来说,我想继续观察到的最后观察结果以完成var的缺失值。例如final数据的第2行

2)当两个观测值中的base_tr不同时,应以var中较高的值继续观测。例如final数据的第13行。

3)当base_tr与两个obs和cond==1相同时,应结转感兴趣变量的较低值。 e.f. final数据的第9行。

4)如果两个对象的base_trcond==1相同,但结转的最后一个值是不同的base_tr ,则应该继续发扬更高的价值。 final数据集的第4行说明了这种情况。

说明逻辑。从date 3开始,ID 1正在使用Treatment B,该值具有更高的varvar=2)。因此,它停止接受Treatment=-A中的治疗A(date=4)的事实不应影响var的得分,该得分现在由治疗ID 1开始接受{ {1}}。

date 3的情况不同。由于ID=2date=2正在服用ID 2,因此,由于它停止接受Treatment D中的治疗D(Treatment=-D),因此date=4的值应转到0。

我可以使用以下代码处理前两个条件,但如果可能的话,我想解决整个问题

var

欢迎任何建议 预先感谢您的帮助

p.s注意,一旦df%>% group_by(ID)%>% mutate(d = unlist(accumulate2(var,cond[-1],function(z,x,y) if(y) min(z,x,na.rm=TRUE) else max(z,x,na.rm=TRUE)))) 变量中的结果正确后,我就不再关心varTreatment变量)

0 个答案:

没有答案