通过ID列表进行循环并计数值

AO_30

我希望有人可以帮助我解决我的问题,我知道使用两个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
G.格洛腾迪克

rleid在data.table包中可以提供帮助。我们将0用作检查块。

library(data.table)
AllPatDT <- data.table(AllPat)
AllPatDT[, Block := ave(.I, rleid(X.Pat, Visit), FUN = seq_along) * (Visit == "o")]

给予:

> AllPatDT
    X.Pat       Date Visit Block
 1:  #1,l 2015-03-30     c     0
 2:  #1,l 2015-06-03     o     1
 3:  #1,l 2015-07-01     o     2
 4:  #1,l 2015-07-20     c     0
 5:  #1,l 2016-03-16     o     1
 6:  #1,l 2016-04-13     o     2
 7:  #1,l 2016-05-09     c     0
 8:  #2,l 2014-12-23     c     0
 9:  #2,l 2015-01-21     o     1
10:  #2,l 2015-03-16     c     0
11:  #2,l 2015-11-23     o     1

如果您更喜欢直接的data.frame,那么仅使用rleiddata.table包中的内容:

library(data.table)

n <- nrow(AllPat)
transform(AllPat, Block = ave(1:n, rleid(X.Pat, Visit), FUN = seq_along) * (Visit == "o"))

注意

我们将以下内容用作AllPat

Lines <- "#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"
AllPat <- read.table(text = Lines, header = TRUE, comment.char = "", as.is = TRUE)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将列表计数与单个整数值进行比较?

提高针对嵌套列表中的ID对项目进行循环计数的python的效率

通过dict的dict计数值

通过PowerShell中的XML进行计数器(for循环?)

在Java中使用While循环对列表中的元素进行计数

对数据点进行计数/分组:for循环还是列表理解?

通过列表和数组列表的数据框进行计算循环

JS代码从列表中获取计数值,然后使用隐藏/显示选择选项进行连接

通过ID计数对数据框列进行排序

嵌套循环后计数值-Google编写

如何获得循环内隐含的计数值

在MySQL中通过联接计数值

熊猫使用外部列表计数值

通过“过滤的”文件列表进行批处理循环

通过R中的列表对线性模型进行循环

使用增强的for循环进行计数

在python中进行计数的循环

在for循环内通过嵌入式if语句进行计数器

通过HUE / IMPALA进行计数

如何使用for循环遍历pandas dataframe列以基于给定的列表对值进行计数

如何通过理解将计数器从这个循环实现到列表?

通过访问数组中的列表中的ID进行访问

通过列表循环名称

通过一个查询对产品列表中的每个产品订单进行计数

按数值对元组列表进行排序Python

向后循环通过列表时,对“试图通过溢出进行减法”感到惊慌

通过满足条件的 Group ID 对多列的观察进行计数和平均值

如何通过包含GoogleSpreadsheet中特定文本的唯一ID值进行计数

对每组groupby熊猫内的计数值进行排序