Я собираюсь решить вашу проблему с помощью простого вектора вместо data.frame
.Об этом легче рассуждать, и он будет легко адаптирован к циклу над столбцами data.frame
.
set.seed(2)
v <- runif(120) + 0.5
Вы можете представить «ежемесячность» вектора, изменив его на массив.
w <- matrix(v, nrow = 12)
w[, 1:3]
# [,1] [,2] [,3]
# [1,] 0.6848823 1.2605133 0.8472722
# [2,] 1.2023740 0.6808201 0.9887732
# [3,] 1.0733263 0.9052822 0.6492469
# [4,] 0.6680519 1.3535485 0.8570626
# [5,] 1.4438393 1.4763985 1.4626440
# [6,] 1.4434750 0.7258255 0.6323720
# [7,] 0.6291590 0.9448092 0.5104145
# [8,] 1.3334488 0.5749794 0.6646422
# [9,] 0.9680185 1.1618988 1.3101921
# [10,] 1.0499837 0.8875495 1.3688610
# [11,] 1.0526741 1.3368892 1.0142818
# [12,] 0.7388948 0.6505014 1.1271963
Из вашего кода вы хотите убедиться, что все значения за месяц в течение 5 лет (включая оригинал) меньше 1. Таким образом, мы можем просто сравнить 6 фрагментов матрицы и объединить результаты.
total_cols <- ncol(w)
comparison <- {
w[, 1:(total_cols - 5)] < 1 &
w[, 2:(total_cols - 4)] < 1 &
w[, 3:(total_cols - 3)] < 1 &
w[, 4:(total_cols - 2)] < 1 &
w[, 5:(total_cols - 1)] < 1 &
w[, 6:(total_cols - 0)] < 1
}
comparison
# [,1] [,2] [,3] [,4] [,5]
# [1,] FALSE FALSE FALSE FALSE FALSE
# [2,] FALSE FALSE FALSE FALSE FALSE
# [3,] FALSE FALSE FALSE FALSE FALSE
# [4,] FALSE FALSE FALSE FALSE FALSE
# [5,] FALSE FALSE FALSE FALSE FALSE
# [6,] FALSE FALSE FALSE FALSE FALSE
# [7,] TRUE TRUE FALSE FALSE FALSE
# [8,] FALSE FALSE FALSE FALSE FALSE
# [9,] FALSE FALSE FALSE FALSE FALSE
# [10,] FALSE FALSE FALSE FALSE FALSE
# [11,] FALSE FALSE FALSE FALSE FALSE
# [12,] FALSE FALSE FALSE FALSE FALSE
Затем мы можем создать новый вектор, используя значения на пять лет вперед, исходя из которых значения comparison
равны TRUE
.
new_v <- rep(NA, length(v))
new_v[which(comparison)] <- w[, -(1:5)][which(comparison)]
new_v
# [1] NA NA NA NA NA NA 0.8881448
# [8] NA NA NA NA NA NA NA
# [15] NA NA NA NA 0.9026427 NA NA
# [22] NA NA NA NA NA NA NA
# [29] NA NA NA NA NA NA NA
# [36] NA NA NA NA NA NA NA
# [43] NA NA NA NA NA NA NA
# [50] NA NA NA NA NA NA NA
# [57] NA NA NA NA NA NA NA
# [64] NA NA NA NA NA NA NA
# [71] NA NA NA NA NA NA NA
# [78] NA NA NA NA NA NA NA
# [85] NA NA NA NA NA NA NA
# [92] NA NA NA NA NA NA NA
# [99] NA NA NA NA NA NA NA
# [106] NA NA NA NA NA NA NA
# [113] NA NA NA NA NA NA NA