6645


時系列のデータを折れ線グラフにするスクリプトは、下記のように書きました。

[code]

    a <- read.table("Sequence2.csv",sep=",", header=T)
    names(a) <- c("NO","Time","SequenceNO")
    plot( a[,c("TIME")],a[,c("SequenceNO")],type="l")
    
[/code]

![時系列変動](https://i.stack.imgur.com/2WiiT.jpg)

グラフはこのようになったのですが、グラフの傾きが平らな部分を検出するにはどうすればいいでしょうか。

元のデータ：testfile.csv

[code]

        TIME    SequenceNO
    1   0.000023    7
    2   0.003774    1455
    3   0.004244    2903
    4   0.004645    4351
    5   0.004667    5799
    6   0.0047      7247
    7   0.00472     8695
    8   0.004818    13039
    9   0.004839    18831
    10  0.004936    20279
    11  0.011538    27519
    12  0.029395    34759
    13  0.029433    49239
    14  0.035552    60823
    15  0.039416    60823
    16  0.040157    60823
    17  0.042644    60823
    18  0.049411    60825
    19  0.050914    60826
    20  0.05136     76751
    21  0.059166    101367
    22  0.060155    120191
    23  0.072393    141911
    24  0.095405    152047
    25  0.095636    191143
    26  0.096089    211415
    27  0.11215 262095
    28  0.11589 276575
    
[/code]


CC BY-SA 3.0
2015-02-17T03:23:24.380
6613
2015-02-17T22:32:03.010
2015-02-17T04:03:44.123
7590
question
r
時系列のデータを折れ線グラフにし、グラフの平らな部分を検出したい


「グラフの傾きが平らな部分」というのはまぁ、`df(x)/dx ≒ 0` ということなのでしょう、きっと。  
まずは、以下の関数を定義します。R に詳しければ `apply() family` を使って簡潔に定義できたのでしょうけれど、そうではないので `for
loop` を使っています。

[code]

    myfunc <- function (df, xn, yn) {
      x <- df[[xn]]
      y <- df[[yn]]
      if ( is.null(x) || is.null(y) ) {
        return(invisible(FALSE))
      }
      st <- -1
      for (i in 1:nrow(df)) {
        if ( i < nrow(df) &&
             abs(y[i+1] - y[i]) < (y[i] * 0.001) ) {
          if ( st < 0 ) {
            st <- x[i]
          }
        } else if ( st > 0 ) {
          cat(sprintf("%f - %f\n", st, x[i]))
          st <- -1
        }
      }
      invisible(TRUE)
    }
    
[/code]

入力データ `testfile.csv` を以下だと仮定します(長いので一部省略しています)。質問欄にある `testfile.csv` はなぜか CSV
形式ではないですね。。。

[code]

    NO,Time,SequenceNO
    1,0.000023,1455
    2,0.003774,1455
    3,0.004244,10
          :
    14,0.035552,60823
    15,0.039416,60823
    16,0.040157,60823
    17,0.042644,60823
    18,0.049411,60825
    19,0.050914,60826
    20,0.05136,76751
          :
    26,0.096089,262095
    27,0.11215,262095
    28,0.11589,262095
    
[/code]

以下を実行します。

[code]

    > a <- read.table("testfile.csv", sep=",", header=T)
    > myfunc(a, "Time", "SequenceNO")
    0.000023 - 0.003774
    0.035552 - 0.050914
    0.096089 - 0.115890
    
[/code]

判定結果を `cat()` で stdout に出力していますが、vector などにして return する方が良いかもしれません。


CC BY-SA 3.0
2015-02-17T15:43:03.420
6645
2015-02-17T22:32:03.010
2015-02-17T22:32:03.010
6613
answer