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

How to calculate the total time duration of concentration crossing a threshold multiple times?

使用 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

Solid lines represent the concentrations for 3 different subjects

我尝试使用以下代码:

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

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

我如何编写一个代码,通过排除它们来考虑浓度下降到虚线以下的时间。最终结果将是蓝色虚线上方所有时间的总持续时间。如下图

我认为你的解决方案几乎是完美的,只是省略了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

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

#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))