2016-08-01 112 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

對不起,嘗試過但仍然給我不同的結果。你能寫出你使用的代碼嗎? –