在R中对大量变量应用均值插补

4
我有一个数据集,其中包含498个变量,包括数字、逻辑、日期和其他类型,并且我将其作为R中的数据框,行表示观测值,列表示变量。这些变量中有一部分缺失值,我希望用该变量的均值来替换它们。
我编写了一个非常简单的函数来执行均值插补:
impute.mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))

如果我只将其应用于单个变量,比如dataset$variableA,那么它可以完美地运行:

dataset$variableA <- impute.mean(dataset$variableA)

如果我手动逐个变量进行填充,对于“one”变量来说,这样做可以得到我想要的结果,但是因为我有一个相当大的变量子集需要这样做,所以我不想手动操作。

我的第一反应是使用R中的其中一个apply函数进行高效的操作,但是我似乎不太理解如何确切地操作。

粗略的第一次尝试是使用标准的apply:

newdataset <- apply(dataset, 2, impute.mean)

这显然有些粗糙,因为它试图将函数应用于包括非数字变量在内的所有列,但即使它可能会生成许多警告,它似乎是一个合理的起点。然而,可惜的是,这种方法没有起作用,所有的变量都保持不变。

我也尝试了lapply、mapply、ddply等方法进行实验,但迄今为止都没有成功。

理想情况下,我希望能够做到这样:

relevantVariables <- c("variableA1", "variableA2", ..., "variableA293")
newdataset <- magical.apply(dataset, relevantVariables, impute.mean)

有没有一些类似的应用程序可以按照这种方式工作?

或者,有没有其他有效的方法来处理这个问题?

2个回答

1

您可以使用data.table包高效地完成此操作:

SetNAsToMean <- function(dt, vars) {                                                                                                                             
  # Sets NA values of columns to the column means                                                                                                                
  #                                                                                                                                                              
  # Args:                                                                                                                                                        
  #   dt: data.table object to work with                                                                                                                         
  #   vars: vector of column names to replace NAs                                                                                                                
  #                                                                                                                                                              
  # Returns:                                                                                                                                                     
  #   Nothing. Alters data.table in place.                                                                                                                       
  #                                                                                                                                                              
  # Example:                                                                                                                                                     
  #   dt <- data.table(num1 = c(1, NA, 3),                                                                                                                       
  #                    num2 = c(NA, NA, 4),                                                                                                                      
  #                    char1 = rep("a", 3))                                                                                                                      
  #   SetNAsToMean(dt, c("num1", "num2"))                                                                                                                        
  #   # Alternatively, set all numeric columns                                                                                                                    
  #   numerics <- which(lapply(dt, class) == "numeric")                                                                                                           
  #   SetNAsToMean(dt, numerics)
  require(data.table)
  for (var in vars) {                                                                                                                                            
    set(dt, which(is.na(dt[[var]])), var, mean(dt[[var]], na.rm=T))                                                                                              
  }                                                                                                                                                              
}           

0

这样能满足您的需求吗?

for (j in 1:length(dataset[1,]))
    {

        if (is.numeric(dataset[,j]))
        {
            for(k in 1:length(dataset[,1]))
            {
                if(is.na(dataset[k,j]))
                {
                    dataset[k,j] <- mean(dataset[,j],na.rm=T)
                }
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接