同一符号数値の連続数の確認

長さNの数値ベクトルの要素1番目からN番目に向かって正数または負数が連続している長さを確認する一つの方法です。

次の function_to_check_the_number_of_consecutive_signs として関数にまとめました。

function_to_check_the_number_of_consecutive_signs <- function(x, column_objective = NULL, positive = T) {
  data_objective <- x %>% data.frame(check.names = F)
  if (is.null(column_objective)) {
    column_objective <- ncol(data_objective)
  }
  data_objective$sign <- paste0("data_objective[,column_objective,drop = F]", paste0(ifelse(positive, ">", "<"), 0)) %>%
    {
      eval(parse(text = .))
    } %>%
    as.numeric()
  i <- 1
  data_objective$sequence[i] <- data_objective$sign[i]
  i <- 2
  for (i in 2:nrow(data_objective)) {
    if (data_objective$sign[i] != 0) {
      data_objective$sequence[i] <- data_objective$sign[i] + data_objective$sequence[i - 1]
    } else {
      data_objective$sequence[i] <- 0
    }
  }
  return(data_objective)
}

始めに {負,正,正,正,ゼロ,負,負,ゼロ,正,負,正,正,正} と連なる サンプルベクトル(x) を作成します。

x <- c(-2, 5, 5, 5, 0, -2, -2, 0, 5, -2, 5, 5, 5)

同ベクトルについて正数が連続する長さを確認したいとします。

つまりベクトル {0,1,2,3,0,0,0,0,1,0,1,2,3} が返されてくるコードを考えます。

関数 function_to_check_the_number_of_consecutive_signs の 引数x にサンプルベクトルを設定します。

function_to_check_the_number_of_consecutive_signs(x = x)
    . sign sequence
1  -2    0        0
2   5    1        1
3   5    1        2
4   5    1        3
5   0    0        0
6  -2    0        0
7  -2    0        0
8   0    0        0
9   5    1        1
10 -2    0        0
11  5    1        1
12  5    1        2
13  5    1        3

上記結果の sequence列 が正数の連続長さを記したベクトルです。

負数の連続長さを確認したい場合は引数 positiveFALSE とします。

function_to_check_the_number_of_consecutive_signs(x = x, positive = FALSE)
    . sign sequence
1  -2    1        1
2   5    0        0
3   5    0        0
4   5    0        0
5   0    0        0
6  -2    1        1
7  -2    1        2
8   0    0        0
9   5    0        0
10 -2    1        1
11  5    0        0
12  5    0        0
13  5    0        0

データフレームの指定した列の正数の連続長さ確認したい場合は、対象とする列番号を引数 column_objective に設定します。

サンプルとするデータフレームを作成します。

(sampledf <- data.frame(x, y = seq(x)))
    x  y
1  -2  1
2   5  2
3   5  3
4   5  4
5   0  5
6  -2  6
7  -2  7
8   0  8
9   5  9
10 -2 10
11  5 11
12  5 12
13  5 13

1列目(x列)の正数の連続長さを確認します。column_objective = 1 とします。

function_to_check_the_number_of_consecutive_signs(x = sampledf, column_objective = 1)
    x  y sign sequence
1  -2  1    0        0
2   5  2    1        1
3   5  3    1        2
4   5  4    1        3
5   0  5    0        0
6  -2  6    0        0
7  -2  7    0        0
8   0  8    0        0
9   5  9    1        1
10 -2 10    0        0
11  5 11    1        1
12  5 12    1        2
13  5 13    1        3

同列の負数の連続長さを確認します。

function_to_check_the_number_of_consecutive_signs(x = sampledf, column_objective = 1, positive = FALSE)
    x  y sign sequence
1  -2  1    1        1
2   5  2    0        0
3   5  3    0        0
4   5  4    0        0
5   0  5    0        0
6  -2  6    1        1
7  -2  7    1        2
8   0  8    0        0
9   5  9    0        0
10 -2 10    1        1
11  5 11    0        0
12  5 12    0        0
13  5 13    0        0

以上です。