Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写一个r函数,用以前的值替换缺少的值_R_Missing Data - Fatal编程技术网

编写一个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

我尝试将丢失的值替换为以前的值,它可以工作,但我未能将其作为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
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))使用
跳过第一种情况,或检查循环前的行数是否大于或等于两行