R 计算浓度在数据帧中保持在一定值以上的时间
我想计算浓度超过200的时间。我的模拟数据框有以下列: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
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