【发布时间】:2018-03-25 19:31:36
【问题描述】:
我希望有人可以帮助我解决我的问题,我知道使用两个 for 循环不是很有效,但这是我的第一个解决方案。我有一个包含眼科患者的数据框(AllPat)(患者 ID、日期和就诊 ->'o'perations 或 'c'heckups)
#Pat Date Visit
#1,l 2015-03-30 c
#1,l 2015-06-03 o
#1,l 2015-07-01 o
#1,l 2015-07-20 c
#1,l 2016-03-16 o
#1,l 2016-04-13 o
#1,l 2016-05-09 c
#2,l 2014-12-23 c
#2,l 2015-01-21 o
#2,l 2015-03-16 c
#2,l 2015-11-23 o
我想计算每个患者 ID 的操作块(检查前后)
#Pat Date Visit Block
#1,l 2015-03-30 c
#1,l 2015-06-03 o 1
#1,l 2015-07-01 o 2
#1,l 2015-07-20 c
#1,l 2016-03-16 o 1
#1,l 2016-04-13 o 2
#1,l 2016-05-09 c
#2,l 2014-12-23 c
#2,l 2015-01-21 o 1
#2,l 2015-03-16 c
#2,l 2015-11-23 o 1
这就是当前的代码:
for(i in unique(AllPat$Pat)){
op <- 0
for(j in AllPat$Pat){
if(i == j) {
if(AllPat$Visit[AllPat$Pat == j] == "o") {
AllPat$Block[AllPat$Pat == j] <- op
op <- op+1
}
else op<-0
}
}
}
我的问题是,$Block 中的值只有在我在数据框视图中手动排序时才可见,也许有人有更好的解决方案并且可以帮助我
更新: 我当前的数据框和建议的函数 rleid:
Patient Date Visit DiffDate Block
3,r 16.02.2016 m 0
3,r 16.02.2016 m 0 0
3,r 16.02.2016 m 0 0
3,r 16.02.2016 m 0 0
3,r 20.04.2016 o 64 1
3,r 18.05.2016 o 28 1 <<- should be 2
3,r 15.06.2016 o 28 1 <<- should be 3
3,r 04.07.2016 m 19 0
3,r 27.07.2016 o 23 1
3,r 24.08.2016 o 28 2
3,r 18.10.2016 o 55 3
也许我应该改变我的 difftime 函数? 当前计算块的代码是:
n <- nrow(AllPat)
AllPat<- transform(AllPat, Block = ave(1:n, rleid(Patient, Visit, (DiffDate<= 60)), FUN = seq_along) * (Visit== "o"))
以及日期之间的差异:
setDT(AllPat)[, DiffDate:= difftime(AllPat$Date, shift(AllPat$Date), units = "days"), by = c("Patient")]
更新
4,l 2015-05-18 m NA 0
4,l 2015-10-20 o 155 1
4,l 2016-05-31 o 224 2 <<-1
4,l 2016-07-26 o 56 1
【问题讨论】:
标签: r for-loop if-statement transform