含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 有循环来说,它的工作速度太慢了。
你有更好的方法吗?
由于希望y
在x
的比例缺失时保持不变,所以可以计算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
我有一个包含 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 有循环来说,它的工作速度太慢了。
你有更好的方法吗?
由于希望y
在x
的比例缺失时保持不变,所以可以计算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