在R数据表中查找上升或下降趋势

时间:2019-09-09 09:10:08

标签: r dataframe datatable rstudio

我有一个像这样的数据表:

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

1 个答案:

答案 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