编写一个r函数,用以前的值替换缺少的值
我尝试将丢失的值替换为以前的值,它可以工作,但我未能将其作为r函数编写 以下代码使用循环将缺少的值替换为其最后一个值。有人能告诉我如何修改代码吗编写一个r函数,用以前的值替换缺少的值,r,missing-data,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(i
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
t=data.frame(id=c(1,NA,3,NA,4,NA,NA))#创建数据
#作用
rretainmissing已经有一些函数可以有效地执行此操作,即tidyr::fill
和zoo::na.locf
,但要修复现有的问题,需要将列名作为字符串传递,并相应地传递子集,并确保函数在循环后返回数据:
t=data.frame(id=c(1,NA,3,NA,4,NA,NA))#创建数据
#作用
rretainmissing已经有一些函数可以有效地执行此操作,即tidyr::fill
和zoo::na.locf
,但要修复现有的问题,需要将列名作为字符串传递,并相应地传递子集,并确保函数在循环后返回数据:
t=data.frame(id=c(1,NA,3,NA,4,NA,NA))#创建数据
#作用
rretainmissing我们可以使用Rcpp
创建一个函数。以下代码另存为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;
}
或者可以使用zoo
library(zoo)
na.locf(df)
# id
#1 1
#2 1
#3 3
#4 3
#5 4
#6 4
#7 4
数据
df我们可以使用Rcpp
创建一个函数。以下代码另存为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;
}
或者可以使用zoo
library(zoo)
na.locf(df)
# id
#1 1
#2 1
#3 3
#4 3
#5 4
#6 4
#7 4
数据
df请参见tidyr::fill
或zoo::na.locf
。感谢您对tidyr软件包的建议,但我仍然想知道我的函数中有什么错误以及如何修改。此外,如果数据
有一行,您的循环将以2:1的比例为I执行,如果它有0行,则为2:0。为安全起见,请将用于seq_len(nrow(data))
中的i,并跳过第一种情况,或检查循环前的行数是否大于或等于两行请参见tidyr::fill
或zoo::na.locf
。感谢您对tidyr软件包的建议,但是我仍然想知道我的函数中有什么错误,以及如何修改为。另外,如果数据
有1行,那么你的循环将在2:1中为I取,如果它有0行,则为2:0。为安全起见,请对序列中的i(nrow(data))使用,
跳过第一种情况,或检查循环前的行数是否大于或等于两行