用现有数据替换向量中的缺失数据

时间:2012-10-08 22:38:03

标签: r

我有一个向量(我实际上刚刚从数据帧中检索了各个列),其中包含缺少的数据。我想用向量中的下一个可用数据(或下一个数据,如果下一个数据不可用)替换丢失的数据。例如,

data <- c(NA, NA, NA, NA, 5, NA, NA, 7, NA, NA)

应该成为

data <- c(5, 5, 5, 5, 5, 7, 7, 7, 7, 7)

我知道这是填写缺失数据的一种非常具体的方法,但我想知道是否有一个优雅的解决方案。我尝试使用which(is.na(data))来获取缺失的索引和which(!is.na(data))来获取带有数据的索引,但是即使使用这两个索引列表来操纵向量也需要很多混乱的逻辑。我想知道我是否以任何方式滥用which,或者是否有其他内置函数或软件包可以让我优雅地执行此逻辑。

感谢您的帮助!

作为参考,只要向量不以一堆NA结束,下面的代码就可以工作,但我必须添加更多逻辑才能使它与原始数据集一起工作。

data <- c(NA, NA, NA, NA, 5, NA, NA, 7)
missingIndeces <- which(is.na(data))
filledIndeces <- which(!is.na(data))
if(length(missingIndeces) > 1) {
    for(j in 1:length(data)) {
        temp <- data[j:length(data)]
        filledData <- which(!is.na(temp))
        if(filledData[1] > 1)
            data[j] <- temp[filledData[1]]
    }
}

2 个答案:

答案 0 :(得分:6)

也许使用na.locf ...?

library(zoo)
na.locf(na.locf(zoo(data),fromLast = TRUE,na.rm = FALSE),na.rm = FALSE)
 1  2  3  4  5  6  7  8  9 10 
 5  5  5  5  5  7  7  7  7  7 

答案 1 :(得分:1)

我想使用runner r cran软件包添加下一个解决方案。

library(runner)
> fill_run(data, run_for_first = T)
 [1] 5 5 5 5 5 5 5 7 7 7
> rev(fill_run(rev(data), run_for_first = T))
 [1] 5 5 5 5 5 7 7 7 7 7

整个软件包都经过了优化,并且主要部分都是用cpp编写的。从而提供很大的效率。