我正在尝试递归替换NA和零值。 我正在处理的是时间序列数据,其中NA或零最好用上一周的值替换(每15分钟测量一次,因此需要往回672个步骤)。 我的数据包含约两年的15分钟值,因此这是一个大型数据集。 不太可能有很多NA或零值,并且也不期望出现相邻的零序列或NA> 672。
我在这个主题 ( R中的递归替换 ) 中找到了一个递归方法,并将其适应于我的问题。
现在这是“最好”的方法还是优雅的方法吗?当第一个672个值中出现零值时,我如何保护我的代码免受错误影响? 我习惯于使用Matlab,在那里我会执行以下操作:
现在可以使用if else语句来解决这个问题,但我不知道如何应用。类似于:
当然,INDEX不是有效的代码。
我在这个主题 ( 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]
}
当然,INDEX不是有效的代码。