我尝试替换缺失值以前的值并且它可以工作,但是我没能把它写成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
答案 0 :(得分:2)
已经有一些功能可以有效地执行此操作,即tidyr::fill
和zoo::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]