0

[更新: 明確化と簡素化を試み、サンプル コードとデータを修正しました。]

数日間にわたって行われた一連の測定値があります。任意の測定値で取得できる数値の範囲は 1 ~ 25 です (実際には、テスト セットが与えられた場合、範囲は最大 100 または最小 20 になる可能性があります)。

測定列に関係なく、特定の数値が発生してから経過したイベントの数を集計する方法が必要です。以下に示すように、数が一致した後にカウントをリセットしたいと思います。

V1、V2、Vn はキャプチャされた値です。Match1、Match2、Matchn は、最後に検出された列以降のカウントです。

注: どの Vx 列 n が検出されたかに関係なく、Matchn カウントが増分されます。

どんな助けでも大歓迎です。

これは私の以前の投稿ここに多少関連しています

サンプル入力

library(data.table)
t <- data.table(
  Date = as.Date(c("2013-5-1", "2013-5-2", "2013-5-3", "2013-5-4", "2013-5-5", "2013-5-6", "2013-5-7", "2013-5-8", "2013-5-9", "2013-5-10")),
  V1 = c(4, 2, 3, 1,7,22,35,3,29,36),
  V2 = c(2, 5, 12, 4,8,2,38,50,4,1)
)

サンプル出力を作成するためのコード

t$match1 <- c(1,2,3,4,1,2,3,4,5,1)
t$match2 <- c(1,1,2,3,4,5,1,2,3,4)
t$match3 <- c(1,2,3,1,2,3,4,5,1,2)

> t
          Date V1 V2 match1 match2 match3
 1: 2013-05-01  4  2      1      1      1
 2: 2013-05-02  2  5      2      1      2
 3: 2013-05-03  3 12      3      2      3
 4: 2013-05-04  1  4      4      3      1
 5: 2013-05-05  7  8      1      4      2
 6: 2013-05-06 22  2      2      5      3
 7: 2013-05-07 35 38      3      1      4
 8: 2013-05-08  3 50      4      2      5
 9: 2013-05-09 29  4      5      3      1
10: 2013-05-10 36  1      1      4      2
4

1 に答える 1

2

OPにはたくさんのタイプミスがあると思います。私が理解している限り、これが必要です:

t <- data.table(
  Date = as.Date(c("2013-5-1", "2013-5-2", "2013-5-3", "2013-5-4", "2013-5-5", "2013-5-6", "2013-5-7", "2013-5-8", "2013-5-9", "2013-5-10")),
  V1 = c(4, 2, 3, 1,7,22,35,52,29,36),
  V2 = c(2, 5, 2, 4,8,47,38,50,4,1)
)

t[, inclusive.match.1 := 1:.N, by = cumsum(V1 == 1 | V2 == 1)]
t[, exclusive.match.1 := 1:.N, by = rev(cumsum(rev(V1 == 1 | V2 == 1)))]
t
#          Date V1 V2 inclusive.match.1 exclusive.match.1
# 1: 2013-05-01  4  2                 1                 1
# 2: 2013-05-02  2  5                 2                 2
# 3: 2013-05-03  3  2                 3                 3
# 4: 2013-05-04  1  4                 1                 4
# 5: 2013-05-05  7  8                 2                 1
# 6: 2013-05-06 22 47                 3                 2
# 7: 2013-05-07 35 38                 4                 3
# 8: 2013-05-08 52 50                 5                 4
# 9: 2013-05-09 29  4                 6                 5
#10: 2013-05-10 36  1                 1                 6
于 2013-08-14T14:52:10.350 に答える