含NA值循环计算

Containing NA values loop calculation

我有一个包含 NA 的数字序列。至少有两个连续值不是NA,像这样:

x
# [1]   2 4 NA NA  1 NA  1  2 NA NA

我试着这样做

y[1]=1, y[2]=y[1]*(x[2]/x[1])

当有NA

y[i]=y[i-1]

g<-function(v){
  t=v
  for(i in 2:(length(v)-1))
  { if(!(is.na(v[i])))
    v[i+1]=v[i]*(t[i+1]/t[i])
  else v[i]=v[i-1]
  }
} 

这个功能不行。此外,我尝试按列将函数应用于大型矩阵,但对于 g 有循环来说,它的工作速度太慢了。

你有更好的方法吗?

由于希望yx的比例缺失时保持不变,所以可以计算x的比例,然后填入缺失值使用 1 并继续使用函数 cumprod() 进行多重运算。如果没有 for 循环,我猜这会比您使用的函数更快。

myfun <- function(x) {
  # calculate the ratio of x[i] to x[i-1]
  xrat <- x[-1]/x[-length(x)]
  # when the ratio is missing, define it as 1
  xrat[is.na(xrat)] <- 1
  # define y
  y <- c(1, cumprod(xrat))
  return(y)
}

# your x
x <- c(2, 4, NA, NA, 1, NA, 1, 2, NA, NA)
y <- myfun(x)

结果是这样的

cbind(x, y)
       x y
 [1,]  2 1
 [2,]  4 2
 [3,] NA 2
 [4,] NA 2
 [5,]  1 2
 [6,] NA 2
 [7,]  1 2
 [8,]  2 4
 [9,] NA 4
[10,] NA 4