我有一个面板数据框,其中有很多看起来像这样的缺失值。
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_tr
和cond==1
相同,但结转的最后一个值是不同的base_tr
,则应该继续发扬更高的价值。 final
数据集的第4行说明了这种情况。
说明逻辑。从date 3
开始,ID 1
正在使用Treatment B
,该值具有更高的var
(var=2
)。因此,它停止接受Treatment=-A
中的治疗A(date=4
)的事实不应影响var
的得分,该得分现在由治疗ID 1
开始接受{ {1}}。
date 3
的情况不同。由于ID=2
,date=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))))
变量中的结果正确后,我就不再关心var
或Treatment
变量)