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

时间:2013-06-25 12:53:36

标签: r mean

我有一个包含各种数字,逻辑,日期等498个变量的数据集,我将其作为R中的数据框,其中包含观察行和变量列。我想用这个变量的平均值替换它们的缺失值。

我已将此非常简单的函数编码为均值插补:

impute.mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))

如果我应用于单个变量say dataset $ variableA:

,这可以很好地工作
dataset$variableA <- impute.mean(dataset$variableA)

这样做可以让我得到我想要的一个变量,但因为我有一个相当大的变量子集,我需要这样做,我不想手动这样做通过浏览每个需要插补的变量。

我的第一直觉是使用R中的一个应用函数来有效地执行此操作,但我似乎并不了解如何准确地执行此操作。

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

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

这显然有点粗糙,因为它试图将函数应用于所有列,包括非数字的变量,但它似乎是一个合理的起始位置,即使它可能会产生一些警告。唉,这种方法不起作用,我的所有变量都保持不变。

我还做了一些lapply,mapply,ddply的实验但到目前为止没有任何成功。

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

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

是否有一些以这种方式运作的应用函数?

或者,还有其他一些有效的方法吗?

2 个答案:

答案 0 :(得分: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))                                                                                              
  }                                                                                                                                                              
}           

答案 1 :(得分: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)
                }
            }
        }
    }