首页 > 解决方案 > 如何在 R 的滚动窗口中跳过 NA 列

问题描述

想象一下数据:

>dput(mydata)
structure(c(9.3424, 9.3424, 9.3983, 9.5102, 9.3144, 9.4822, NA, 
NA, NA, NA, NA, NA, 7.8478, 8.1167, 7.6421, 7.4048, 5.3479, 5.3004, 
NA, NA, NA, NA, NA, NA, 13.4319, 13.6184, 13.805, 13.8983, 13.8983, 
13.805), .Dim = c(6L, 5L), .Dimnames = list(NULL, c("1", "2", 
"3", "4", "5")))

我要做的是在滚动窗口中应用算法,该算法所做的是运行采样方法,然后分别为每列生成一些摘要统计信息。这些列不以任何方式相互交互。问题是数据中有NA。我想要发生的是,当滚动窗口充满 NA 时,我希望滚动窗口跳过该列,并在摘要统计信息中放置一个 NA 值。

例子:

mydata<-sp.val[,c(1:5)]
summarrry<-matrix(0,nrow=5,ncol=2)
roller<-5
for (u in 1:roller){
  for (j in 1:5){ #50 is the assets consider using 498
  testdata<-mydata[(u:(u+365)),] 
  lin<-lm(testdata[,1]~testdata[,j],data=as.data.frame(testdata))
  summarrry[j,]<-coef(lin)
  print(summarrry)
  }
}

这将返回错误:

Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  0 (non-NA) cases

这是由于 NA 列。

因此,我想跳过滚动窗口的列:要么充满 NA ( length(which.na(data))==window),要么只有一个数值 ( length(which.na(data))==(window-1))。

所需的输出:运行上述返回:第 1 列是截距,第 2 列是系数。

        [,1]        [,2]
[1,] 2.971253e-15    1
[2,] 0.000000e+00    0
[3,] 0.000000e+00    0
[4,] 0.000000e+00    0
[5,] 0.000000e+00    0

并且由于 NA 提到的错误而停止。我想要发生的事情:

         [,1]       [,2]
[1,] 2.971253e-15    1
[2,] NA              NA
[3,] 2.455878        1.841197
[4,] NA              NA
[5,] 2.5868          0.5759558

标签: rnarolling-computation

解决方案


您的示例代码不可重现(由于 u+365 出现越界错误)。但是,为什么不在那里添加一个if声明呢?

summarrry<-matrix(0,nrow=5,ncol=2)
roller<-5
for (u in 1:roller){
    for (j in 1:5){ #50 is the assets consider using 498
        testdata<-mydata[(u:(u+365)),] 
 # check if there are any non-NAs in the column and then calculate the lm:
        if(any(!is.na(testdata[,j]))) lin<-lm(testdata[,1]~testdata[,j],data=as.data.frame(testdata)) else lin<-NA
        summarrry[j,]<-if (!is.na(lin)) coef(lin) else c(NA,NA)
        print(summarrry)
    }
}

(老实说,我不确定您要达到的目标-{}可能有必要,也可能没有必要)


推荐阅读