我正在尝试递归替换 NA 和零值。我正在研究时间序列数据,其中 NA 或零最好用前一周的值替换(每 15 分钟测量一次,因此后退 672 步)。我的数据包含约两年的 15 分钟值数据,因此这是一个很大的集合。预计不会有太多的 NA 或零,也不会出现相邻的零系列或 NA > 672。
我发现这个线程(R 中的递归替换)显示了递归方式,使其适应了我的问题。
load[is.na(load)] <- 0
o <- rle(load)
o$values[o$values == 0] <- o$values[which(o$values == 0) - 672]
newload<-inverse.rle(o)
现在这是“最好的”还是优雅的方法?当前 672 个值中出现零值时,我将如何保护我的代码免受错误?
我曾经使用 matlab,我会在其中执行以下操作:
% Replace NaN with 0
Load(isnan(Load))=0;
% Find zero values
Ind=find(Load==0);
for f=Ind
if f>672
fprintf('Replacing index %d with the load 1 day ago\n', Ind)
% Replace zero with previous week value
Load(f)=Load(f-672);
end
end
由于我对 R 不熟悉,我将如何设置这样的 if else 循环?
一个可重现的示例(更改代码,因为其他线程使用的示例无法处理相邻的零):
day<-1:24
load<-rep(day, times=10)
load[50:54]<-0
load[112:115]<-NA
load[is.na(load)] <- 0
load[load==0]<-load[which(load == 0) - 24]
这给出了没有零和NA的原始负载数据帧。当前 24 个值中存在零时,这会出错,因为没有值可以替换为:
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
现在要解决这个问题,可以使用 if else 语句,但我不知道如何应用。就像是:
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]
}
Ofcourse INDEX 不是有效的代码..