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