2016-08-01 98 views
5

使用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,请参阅黑线。

enter image description here

我怎么可以编写考虑到了浓度下降虚线下方的时间,排除他们的代码。最终的结果将是蓝色虚线以上的所有时间的总持续时间。像下面

enter image description here

+0

见'?rle'。暂时忽略的多个ID,具有,比如说,'X = SIN(SEQ(-3 * PI,3 * PI,0.1))'和计算的r = RLE(X>阈值)',起始和结束位置连续'TRUE's(即'X> threshold')是'S = cumsum(C(1,R $长度))[R $值]''和E = 1 + R $长度[R $值] - 1'。总结'time [e] - time [s]'应该给出'x> threshold'的总时间。 –

回答

1

所以,感谢罗尔提供了如何解决问题的想法。下面 代码帮我做了分析,然而我不得不添加一个名为“日”变量,然后计算出每一天的持续时间。我在这里使用了一天,因为每天有一个时间间隔。但是你可以根据你的需要进行调整。

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

编辑:计算与原始数据集

使用原始数据set

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

我们得到th e以下结果:

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

出于某种原因,代码给了我不同的答案。 ID V1 1:1 0.5 2:1 0.5 3:1 0.5 4:1 0.5

+0

也许重新启动R对话或更新到最新版本的'data.table'帮助。只需再次检查我的解决方案,并使用最新版本的R,'data.table'和新的R会话在我的机器上运行。 – rhole

+0

对不起,尝试过但仍然给我不同的结果。你能写出你使用的代码吗? –