我有一个像这样的数据表:
timestamp Value
19-07-2019 02:46 5
19-07-2019 02:47 8
19-07-2019 02:48 2
19-07-2019 02:49 4
19-07-2019 02:50 7
19-07-2019 02:51 0
19-07-2019 02:52 3
19-07-2019 02:53 3
19-07-2019 02:54 10
19-07-2019 02:55 1
19-07-2019 02:56 3
19-07-2019 02:57 10
19-07-2019 02:58 3
19-07-2019 02:59 0
19-07-2019 03:00 9
19-07-2019 03:01 7
19-07-2019 03:02 10
19-07-2019 03:03 5
19-07-2019 03:04 10
19-07-2019 03:05 0
我想知道值何时从7个病区达到10。 一旦值为7,则持续时间必须为7到达到10。即使它低于7,也可以...从前7到前10。如果不存在7且存在7.1或大于7的值,考虑到它越过了7。 10岁时也是如此。
我很累:
DT[, group_id := rleid((value >7 & value <10 )) ][]
z<-DT[(value >7 & value <10 ), ][, .(start = min(timestamp),end = max(timestamp),
duration = as.numeric(max(timestamp)-min(timestamp),units='mins')),
by = .(group_id)][,group_id := NULL]
但是它只会给出7到10之间的持续时间。不是从7到10
答案 0 :(得分:1)
我将使用一些布尔逻辑来跟踪列中的每个组,如下所示:
df<-fread("timestamp Value
19-07-2019 02:46 5
19-07-2019 02:47 8
19-07-2019 02:48 2
19-07-2019 02:49 4
19-07-2019 02:50 7
19-07-2019 02:51 0
19-07-2019 02:52 3
19-07-2019 02:53 3
19-07-2019 02:54 10
19-07-2019 02:55 1
19-07-2019 02:56 3
19-07-2019 02:57 10
19-07-2019 02:58 3
19-07-2019 02:59 0
19-07-2019 03:00 9
19-07-2019 03:01 7
19-07-2019 03:02 10
19-07-2019 03:03 5
19-07-2019 03:04 10
19-07-2019 03:05 0")
counter<-1
boolean<-FALSE
for(i in 1:nrow(df)){
if(df$Value[i]>7 && df$Value[i]<10 && boolean ==FALSE){
df$ref[i]<-counter
boolean<-TRUE
}
if(boolean==TRUE){ df$ref[i]<-counter}
if(boolean==FALSE){ df$ref[i]<-0}
if(df$Value[i]==10){
df$ref[i]<-counter
boolean <-FALSE
counter<-counter+1
}}
然后,要把每个部分都放在一个单独的列表中,可以:
library(dplyr)
df %>% filter(ref>0)%>%group_split(ref)
[[1]]
# A tibble: 8 x 4
V1 timestamp Value ref
<chr> <chr> <int> <dbl>
1 19-07-2019 02:47 8 1
2 19-07-2019 02:48 2 1
3 19-07-2019 02:49 4 1
4 19-07-2019 02:50 7 1
5 19-07-2019 02:51 0 1
6 19-07-2019 02:52 3 1
7 19-07-2019 02:53 3 1
8 19-07-2019 02:54 10 1
[[2]]
# A tibble: 1 x 4
V1 timestamp Value ref
<chr> <chr> <int> <dbl>
1 19-07-2019 02:57 10 2
[[3]]
# A tibble: 3 x 4
V1 timestamp Value ref
<chr> <chr> <int> <dbl>
1 19-07-2019 03:00 9 3
2 19-07-2019 03:01 7 3
3 19-07-2019 03:02 10 3
[[4]]
# A tibble: 1 x 4
V1 timestamp Value ref
<chr> <chr> <int> <dbl>
1 19-07-2019 03:04 10 4