Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 更换零和#x27;具有递归值的s和NA_R_Matlab - Fatal编程技术网

R 更换零和#x27;具有递归值的s和NA

R 更换零和#x27;具有递归值的s和NA,r,matlab,R,Matlab,我试图替换NA&零递归值。我正在处理时间序列数据,其中NA或零最好替换为前一周的值(每15分钟测量一次,所以要后退672步)。我的数据包含约两年15分钟的数据,因此这是一个大集合。预期NA或零不多,也不预期零或NA>672的相邻系列 我发现这个线程()显示了一种递归方式,并根据我的问题调整了它 load[is.na(load)] <- 0 o <- rle(load) o$values[o$values == 0] <- o$values[which(o$values == 0

我试图替换NA&零递归值。我正在处理时间序列数据,其中NA或零最好替换为前一周的值(每15分钟测量一次,所以要后退672步)。我的数据包含约两年15分钟的数据,因此这是一个大集合。预期NA或零不多,也不预期零或NA>672的相邻系列

我发现这个线程()显示了一种递归方式,并根据我的问题调整了它

load[is.na(load)] <- 0
o <- rle(load)
o$values[o$values == 0] <- o$values[which(o$values == 0) - 672]
newload<-inverse.rle(o)
由于我对R不熟悉,我如何设置这样一个if-else循环

一个可复制的示例(更改代码,因为从其他线程使用的示例没有处理相邻的零):


day您可以使用以下示例:

set.seed(42)

x <- sample(c(0,1,2,3,NA), 100, T)

stepback <- 6

x_old <- x
x_new <- x_old

repeat{
    filter <- x_new==0 | is.na(x_new)
    x_new[filter] <- c(rep(NA, stepback), head(x_new, -stepback))[filter]
    if(identical(x_old,x_new)) break
    x_old <- x_new
}

x
x_new

请注意,有些值仍然是NA,因为没有用于它们的先验信息。如果您的数据具有足够的先验信息,则不会发生这种情况。

一个选项是将向量包装到包含672行的矩阵中:

load2 <- matrix(load, nrow=672)

load2如果我是正确的,这将用最后一个非NA替换NA,这不是我的目标。我想用一个递归值来替换它“用前面最新的非NA替换每个NA的通用函数”。哦,我的错误。。。在我喝咖啡之前!请提供a(不需要672个值)和预期结果。idx此解决方案适合我!我认为核心替换是
xnew[is.na(x)| x==0)]@CarlWitthoft索引
的问题(is.na(x)|x==0)-后退)
是它可能有负面,这要么抛出错误(如果也有正面索引)要么(更糟)在答案中无声地放入垃圾(如果只有负面)。这是真的。我处理任何递归引用问题的方法都是从第一步开始:清理边界条件。或者添加
max(1,它(无论什么条件))
@CarlWitthoft
pmax
:-)是的,我的错。如果
load
的长度是672的倍数,那么这就可以了,但如果不是这样,那么转换为矩阵(
load2
)将循环一些值以填充最后一列,它们不会打乱应用步骤,但是如果将它们保存在
load4
中,那么您将从系列的第一部分添加额外的值到末尾,这可能会真正打乱分析。我的版本会把它们去掉,知道了。好渔获量:-)
loadtest[c(10,50:54)]<-0 # instead of load[50:54]<-0 gives:

Error in loadtest[which(loadtest == 0) - 24] : 
only 0's may be mixed with negative subscripts
day<-1:24
loadtest<-rep(day, times=10)
loadtest[c(10,50:54)]<-0
loadtest[112:115]<-NA
loadtest[is.na(loadtest)] <- 0 
if(INDEX(loadtest[loadtest==0])<24) {
     # nothing / mean / standard value
    } else {
      loadtest[loadtest==0]<-loadtest[which(loadtest == 0) - 24]
    } 
set.seed(42)

x <- sample(c(0,1,2,3,NA), 100, T)

stepback <- 6

x_old <- x
x_new <- x_old

repeat{
    filter <- x_new==0 | is.na(x_new)
    x_new[filter] <- c(rep(NA, stepback), head(x_new, -stepback))[filter]
    if(identical(x_old,x_new)) break
    x_old <- x_new
}

x
x_new
> x
  [1] NA NA  1 NA  3  2  3  0  3  3  2  3 NA  1  2 NA NA  0  2  2 NA  0 NA NA  0
 [26]  2  1 NA  2 NA  3 NA  1  3  0 NA  0  1 NA  3  1  2  0 NA  2 NA NA  3 NA  3
 [51]  1  1  1  3  0  3  3  0  1  2  3 NA  3  2 NA  0  1 NA  3  1  0  0  1  2  0
 [76]  3  0  1  2  0  2  0  1  3  3  2  1  0  0  1  3  0  1 NA NA  3  1  2  3  3
> x_new
  [1] NA NA  1 NA  3  2  3 NA  3  3  2  3  3  1  2  3  2  3  2  2  2  3  2  3  2
 [26]  2  1  3  2  3  3  2  1  3  2  3  3  1  1  3  1  2  3  1  2  3  1  3  3  3
 [51]  1  1  1  3  3  3  3  1  1  2  3  3  3  2  1  2  1  3  3  1  1  2  1  2  3
 [76]  3  1  1  2  2  2  3  1  3  3  2  1  3  1  1  3  2  1  3  1  3  1  2  3  3
load2 <- matrix(load, nrow=672)
load3 <- apply( load2, 1, locf.function )
load4 <- t(load3)[ seq_along(load) ]