【问题标题】:Finding increasing or decreasing trend in R data table在 R 数据表中查找增加或减少的趋势
【发布时间】:2024-01-23 23:56:01
【问题描述】:

我有一个这样的数据表:

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

【问题讨论】:

    标签: r dataframe datatable rstudio


    【解决方案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
    

    【讨论】:

    • 我怎样才能得到持续时间而不是这个。输出类似于Duration startval endval而不是V1 timestamp Value ref
    • 这就是 fread() 读取数据的方式。然而,这并不影响结果。要更改 colnames,您可以执行 colnames(df)
    • 谢谢。另外我想获得每个组的持续时间而不是列表。因此,如果我有 4 个组,我需要按组获取持续时间(最后一个值 - 第一个值)和起始值、结束值。所以最后我将有 3 列 duration startval endval 和 4 行(组)
    • 如何找到另一种方式,下降趋势?值从 10 下降到 7 ?
    • 复制代码,新建一列,更改条件。