李会超 发表于 2014-11-13 17:57
今天在sql数据库里面查询的时候,发现某列数据有比较多的缺失值,要求该列数据的缺失值用前面的非缺失值填充 ...
length.x = 20000
x = runif(length.x, min = 1, max = 100)
x[ sample(2:length.x, 6000) ] = NA
setNA1 = function(x) {
x[ is.na(x) ] = x[ which(is.na(x)) - 1 ]
if (any(is.na(x))) return(setNA1(x)) else return(x)
}
setNA2 = function(x) {
for (i in 2:length(x)) if (is.na(x[ i ])) x[ i ] = x[ i - 1 ]
return(x)
}
system.time(setNA1(x))
system.time(setNA2(x))
从耗费时间的对比上,方法1要略优于方法2。