如何计算多次超过阈值的浓度总持续时间?

时间:2016-08-01 14:59:41

标签: r time threshold

使用R,我试图计算每个人的总持续时间,其中此持续时间是超过特定阈值的时间。

例如,在下图中我有3个受试者(ID)的浓度数据,我想找到每个人在蓝色虚线上方花费的时间(x轴)。数据集结构类似于:

head(dataset)
  ID time      CP
1  1  0.0 0.00000000
2  1  0.0 0.00000000
3  1  0.5 0.03759806
4  1  1.0 0.12523455
5  1  1.5 0.23483219
6  1  2.0 0.34820905

http://www.mydoname.com/index.php

我尝试使用以下代码:

library(data.table) 
TAbove<-setDT(dataset)[CP > .05, diff(range(time)), by = ID]

然而,这段代码它计算的时间从第一次上升到蓝色虚线到最后一次下降。例如,绿线ID,请参见黑线。

Solid lines represent the concentrations for 3 different subjects

如何编写一个代码,考虑到浓度低于虚线的时间,排除它们。最终结果将是在蓝色虚线上方的所有时间的总持续时间。如下所示

enter image description here

2 个答案:

答案 0 :(得分:2)

我认为您的解决方案几乎是完美的,只需忽略range。我在扩展数据集上尝试了以下内容(添加了几个条目)

> dat <- fread("ID time      CP
+               1  0.0 0.00000000
+               1  0.0 0.00000000
+               1  0.5 0.03759806
+               1  1.0 0.12523455
+               1  1.5 0.23483219
+               1  2.0 0.34820905
+               1  3.0 0.5
+               2  0.0 0.5
+               2  0.5 0.01
+               2  1.0 0.2")

具有以下结果:

> dat[CP > .05, diff(time), by = ID]
   ID  V1
1:  1 0.5
2:  1 0.5
3:  1 1.0
4:  2 1.0

编辑:使用原始数据集进行计算

使用原始数据集

dataset <- fread("ID time      CP
                  1  0.0 0.00000000
                  1  0.0 0.00000000
                  1  0.5 0.03759806
                  1  1.0 0.12523455
                  1  1.5 0.23483219
                  1  2.0 0.34820905")

我们得到以下结果:

> dataset[CP > .05, diff(time), by = ID]
   ID  V1
1:  1 0.5
2:  1 0.5

答案 1 :(得分:1)

所以,感谢rhole提供了如何解决问题的想法。 下面的代码帮助我进行分析,但是我必须添加一个名为&#34; Day&#34;的变量,然后计算每天的持续时间。在这里我用了一天,因为每天有一个间隔。但你可以根据需要进行调整。

#sub-setting by day
dataset$Day[dataset$time>=0 &dataset$time<24] <- "Day 1"
dataset$Day[dataset$time>=24 &dataset$time<48] <- "Day 2"
dataset$Day[dataset$time>=48 &dataset$time<72] <- "Day 3"
#per day#
TAbove<-setDT(dataset)[CP > .05, diff((time)), by = .(ID,Day)]
library(plyr)
# sum the time duration for each day per person
sumPerDay<-summarise(group_by(TAbove, ID,Day),
           sum=sum(V1))
# sum the time duration for ALL days per person
sumAll<-summarise(group_by(TAbove, ID),
                 sum=sum(V1))