写一个r函数来用前一个值替换缺失值

时间:2017-05-27 05:55:53

标签: r missing-data

我尝试替换缺失值以前的值并且它可以工作,但是我没能把它写成r函数。

以下代码是使用循环将缺失值替换为其最后一个值。有人可以告诉我如何修改代码。

t = data.frame(id = c(1,NA,3,NA,4,NA,NA))    # create data

#function
rretainmissing <- function(data, var){
    for(i in 2:nrow(data)){ # 
        data$var[i] <- ifelse(is.na(data$var[i]), data$var[i-1], data$var[i])
    } #
}

t1 = rretainmissing(data = t, var = id)    # use function to create new data

2 个答案:

答案 0 :(得分:2)

已经有一些功能可以有效地执行此操作,即tidyr::fillzoo::na.locf,但为了修复您所拥有的内容,您需要将列名称作为字符串传递,相应的子集,并确保您的函数在循环后返回数据:

t = data.frame(id = c(1,NA,3,NA,4,NA,NA))    # create data

#function
rretainmissing <- function(data, var){
    for(i in 2:nrow(data)){ 
        # this is assigning to a copy of the data in the function's environment...
        data[[var]][i] <- ifelse(is.na(data[[var]][i]), data[[var]][i-1], data[[var]][i])
    }
    data    # ...so return it at the end
}

rretainmissing(data = t, var = 'id')
#>   id
#> 1  1
#> 2  1
#> 3  3
#> 4  3
#> 5  4
#> 6  4
#> 7  4

请注意,您可以使用data[i, var]表单,但双括号表单更安全,而不是依赖drop = TRUE。您也可以使用未评估的列名而不是字符串,但这样做更多。

答案 1 :(得分:0)

我们可以使用replacena.cpp创建一个函数。以下代码保存为#include <Rcpp.h> using namespace Rcpp; //[[Rcpp::export]] NumericVector replace_na_prev(NumericVector x) { int n = x.size(); LogicalVector lv = is_na(x); for(int i = 1; i <= n; i++) { if ((lv[i] == TRUE) & (lv[i-1] != TRUE)) { x[i] = x[i-1]; } } return x; }

sourceCpp

并在R

中使用library(Rcpp) sourceCpp("replacena.cpp") df$id <- replace_na_prev(df$id) df$id #[1] 1 1 3 3 4 4 4 进行了调用
na.locf

或者可以使用zoo

中的library(zoo) na.locf(df) # id #1 1 #2 1 #3 3 #4 3 #5 4 #6 4 #7 4
df <- data.frame(id = c(1,NA,3,NA,4,NA,NA))

数据

[style.border]