使用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
如何编写一个代码,考虑到浓度低于虚线的时间,排除它们。最终结果将是在蓝色虚线上方的所有时间的总持续时间。如下所示
答案 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))