一个用变量mean替换NAs的函数。

问题描述 投票:0回答:1

我已经阅读了与我的问题相关的所有帖子(我很确定我读过)。

我写了一个函数,它能自动检查变量的类,如果它是数值型的,那么就用这些变量的平均值来代替NAs。

下面是代码。

delna<-function(x){
    for (e in 1:ncol(x)){
        if (class(x[,e])=="numeric"){
            for (e in 1:ncol(x)) {
                x[is.na(x[,e]),e]<-mean(x[,e],na.rm = TRUE)
            }}
    }
}

当我验证这个函数时,我没有得到任何结果,而且当在一个数据框架上使用它时,我得到了警告说: :

"在 mean.default(x[, e], na.rm = TRUE) 中:参数不是数字或逻辑:返回 NA"

谢谢大家的帮助!我读了所有与我的问题有关的帖子(我很确定我读了),但我找不到灵感。

r function rstudio na
1个回答
0
投票

data.table假设你想处理的列是 "a","b","c"。

library(data.table)
setDT(df)
lapply(c("a","b","c"), function(colname){
  df[is.na(get(colname)), c(colname) := mean(df[[colname]], na.rm = TRUE)]
})

不需要重新分配,你的初始数据框架已经被修改。


0
投票

这个解决方案很复杂,但它的使用很简单。我创建了一个通用的 delna 和方法

  1. 一个默认的方法,以取代 NA的在 一个 数字向量。
  2. 类对象的方法 "matrix";
  3. 类对象的方法; "data.frame";
  4. 类对象的方法; "list".

然后,所有需要做的就是调用 delna(object) 而一切都会自动进行。

delna <- function(x, ...) UseMethod("delna")
delna.default <- function(x, ...){
  stopifnot(is.numeric(x))
  mu <- mean(x, na.rm = TRUE)
  x[is.na(x)] <- mu
  x
}
delna.matrix <- function(x, ...){
  x[] <- apply(x, 2, delna)
  x
}
delna.data.frame <- function(x, ...){
  is_num <- sapply(x, is.numeric)
  x[is_num] <- lapply(x[is_num], delna)
  x
}
delna.list <- function(x, ...){
  is_num <- sapply(x, is.numeric)
  x[is_num] <- lapply(x[is_num], delna)
  x
}


delna(letters)
delna(x)
delna(mat)
delna(dat)
delna(as.list(dat))

测试数据创建代码。

set.seed(1234)
x <- sample(10)
is.na(x) <- sample(10, 4)
mat <- replicate(5, {
  x <- sample(10)
  is.na(x) <- sample(10, 3)
  x
})
dat <- as.data.frame(mat)

0
投票

结果发现我漏掉了return(x),现在函数看起来是这样的

    delna<-function(x){
  for (e in 1:ncol(x)){
    if (is.numeric(x[,e])){
      x[is.na(x[,e]),e]<-mean(x[,e],na.rm = TRUE)
      }
  }
  return(x)
}

然后我就可以通过写data<-delna(data)来进行我想要的修改,或者把它分配给一个新的df

© www.soinside.com 2019 - 2024. All rights reserved.