R 计算浓度在数据帧中保持在一定值以上的时间

R 计算浓度在数据帧中保持在一定值以上的时间,r,dataframe,dplyr,R,Dataframe,Dplyr,我想计算浓度超过200的时间。我的模拟数据框有以下列: df <- ID TIME CONC 1 0 20 1 2 50 1 4 150 1 6 210 1 9 260 2 0 20 2 2 50 2 4 70 2 6 100 2 9 150 3 0 20 3 2

我想计算浓度超过200的时间。我的模拟数据框有以下列:

df <- 
ID   TIME   CONC 
1     0      20
1     2      50
1     4      150
1     6      210
1     9      260
2     0      20
2     2      50
2     4      70
2     6      100
2     9      150
3     0      20
3     2      50
3     4      250
3     6      310
3     9      150
其中:

df <- 
ID   TIME   CONC   FLAG
1     0      20     0
1     2      50     0
1     4      150    0
1     6      210    1
1     9      260    1
2     0      20     0  
2     2      50     0 
2     4      70     0
2     6      100    0
2     9      150    0
3     0      20     0
3     2      50     0
3     4      250    1
3     6      310    1
3     9      150    0

使用浓度至少为200的指示器上的
diff
,您可以识别感兴趣的时间范围的所有开始和结束,将这些时间戳的差异相加以获得总经过时间:

library(dplyr)
df %>%
  group_by(ID) %>%
  summarize(tdiff = sum(TIME[diff(c(CONC >= 200, 0)) == -1] -
                        TIME[diff(c(0, CONC >= 200)) == 1]))
#      ID tdiff
#   (int) (int)
# 1     1     3
# 2     2     0
# 3     3     2

请注意,此代码即使在给定ID有至少200个值的多次运行的情况下也能工作,并且它不会计算值降至200以下的两次运行之间的时间。

最好使用dplyr,因为它允许我通过数据集中的不同变量进行汇总(即根据ID和其他内容进行SuamRase)但是我想通过
ID
获得如何做这件事的基本知识;setDT(df)[CONC>200,diff(range(TIME)),by=ID]不带标志或任何东西,尽管这会跳过缺少的ID。或者如果您坚持使用NAs,您可以使用
setDT(df)[,if(any(CONC>200))diff(range(TIME[CONC>200]))或者NA_integer_,by=ID]
谢谢。这是有用的。我还有一件事;我可以将
CONC
开始的日期>=200添加到我的输出数据框中吗?对于上面的示例,所有时间都是在第1天,但我的数据中有一个长达21天的延长时间点。@您可以将
firstTime=min(time[CONC>=200])
添加到
summary
调用中,以获得浓度首次超过200的时间。我不清楚时间是如何映射到天的,因为您在示例数据中没有提供任何关于这一天的信息。假设时间是以小时为单位的。是的,这是有道理的。谢谢
dfout <- 
ID   tdif
1     3
2     NA
3     2
library(dplyr)
df %>%
  group_by(ID) %>%
  summarize(tdiff = sum(TIME[diff(c(CONC >= 200, 0)) == -1] -
                        TIME[diff(c(0, CONC >= 200)) == 1]))
#      ID tdiff
#   (int) (int)
# 1     1     3
# 2     2     0
# 3     3     2