R 有没有办法不让这个循环

R 有没有办法不让这个循环,r,for-loop,dplyr,R,For Loop,Dplyr,我有以下使用月度数据的代码: set.seed(2) vector <- as.data.frame(runif(120)+0.5) b <- data.frame() for (j in 1:I(nrow(vector))) { if (is.na(vector[j, i]) || is.na(vector[j + 12, i]) || is.na(vector[j + 24, i]) || is.na(vector[j + 36

我有以下使用月度数据的代码:

set.seed(2)
vector <- as.data.frame(runif(120)+0.5)
b <- data.frame()

    for (j in 1:I(nrow(vector))) {
        if (is.na(vector[j, i]) || is.na(vector[j + 12, i]) || 
            is.na(vector[j + 24, i]) || is.na(vector[j + 36, i]) ||
            is.na(vector[j + 48, i]) || is.na(vector[j + 60, i])) {
            b[j, i] <- NA
        } else if (vector[j, i] < 1 && vector[j + 12, i] < 1 && 
            vector[j + 24, i] < 1 && vector[j + 36, i] < 1 && 
            vector[j + 48, i] < 1) {
            b[j, i] <- vector[j + 60, i]
        } else {
            b[j, i] <- NA
        }
    }
set.seed(2)
vector不太清楚(对我来说)这里要输出什么,但dplyr的“lead”函数应该能够做到这一点,并且应该可以为您节省大量的NA检查

如果您只想获得提前一年的价值,使用NAs如果没有提前一年的价值,那么应该这样做:

vector <- data.frame(obs = runif(120)+0.5) # giving this variable a name for 
convenience
vector %>% 
  mutate(year_later = lead(obs, 12),
         two_years_later = lead(obs, 24)) # etc
vector%
突变(年后=铅(obs,12),
两年后=领先(obs,24))#等
我把这些都放在一个数据帧中,但当然你们可以让你们的
b不太清楚(对我来说)你们在这里想要什么输出,但dplyr的“lead”函数应该能够做到这一点,并且应该可以为你们节省大量的NA检查

如果您只想获得提前一年的价值,使用NAs如果没有提前一年的价值,那么应该这样做:

vector <- data.frame(obs = runif(120)+0.5) # giving this variable a name for 
convenience
vector %>% 
  mutate(year_later = lead(obs, 12),
         two_years_later = lead(obs, 24)) # etc
vector%
突变(年后=铅(obs,12),
两年后=领先(obs,24))#等

我把这些都放在一个数据帧中,当然你可以保留你的
b我将用一个简单的向量来解决你的问题,而不是
data.frame
。它更容易推理,也更容易适应
data.frame
列上的循环

set.seed(2)
v <- runif(120) + 0.5

我将用一个简单的向量而不是
data.frame
来解决您的问题。它更容易推理,也更容易适应
data.frame
列上的循环

set.seed(2)
v <- runif(120) + 0.5

查看dplyr的“超前”和“滞后”功能。首先尝试结合“group_by(year)”。在尝试访问整个数据帧时,可能会出现(语义)错误<代码>向量[j+48,i]
j=nrow(vector)-47时将不存在
is.na
然后将返回TRUE。因此,对于最后60行中的所有测试,您将获得TRUE。所显示的代码只是抛出了一个错误(与尝试
if(NA){.}
有关,请检查dplyr的“lead”和“lag”函数。首先尝试与“groupu by(year)”组合。在尝试访问整个数据帧时,似乎会出现(语义)错误。
vector[j+48,i]当您在
j=nrow(vector)-47时,
将不存在。然后,na
将返回TRUE。因此,对于最后60行中的所有测试,您将得到TRUE。显示的代码只是抛出一个错误(与尝试
if(na){.}
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
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