r data.table 为多组列估算缺失值

use*_*412 1 r function missing-data data.table imputation

我想为几组列估算缺失值。这个想法是对于数值变量,我想使用中位数来估算NA,对于分类变量,我想使用模式来估算NA. 我确实搜索了如何为不同的列集分别估算它,但没有找到。

我的数据很大,有很多列,所以我把它放在data.table 中。由于我不确定如何在 data.table 中执行此操作,因此我尝试了下面的代码库 R。我尝试了下面的代码,但不知何故,我似乎弄乱了列名标识。

我的数据很大并且有多个变量。我存储载体数值变量var_num,我存储载体分类变量var_chr

请参阅下面的示例代码 -

library(data.table)
set.seed(1200)
id <- 1:100
bills <- sample(c(1:20,NA),100,replace = T)
nos <- sample(c(1:80,NA),100,replace = T)
stru <- sample(c("A","B","C","D",NA),100,replace = T)
type <- sample(c(1:7,NA),100,replace = T)
value <- sample(c(100:1000,NA),100,replace = T)

df1 <- as.data.table(data.frame(id,bills,nos,stru,type,value))
class(df1)

var_num <- c("bills","nos","value")
var_chr <- c("stru","type")

impute <- function(x){
  #print(x)
  if(colnames(x) %in% var_num){
    x[is.na(x)] = median(x,na.rm = T)
  } else if (colnames(x) %in% var_chr){
    x[is.na(x)] = mode(x)
  } else {
    x #if not part of var_num and var_chr then nothing needs to be done and return the original value
  }
  return(x)
}


df1_imp_med <- data.frame(apply(df1,2,impute))
Run Code Online (Sandbox Code Playgroud)

当我尝试运行上述程序时,它给了我错误 Error in if (colnames(x) %in% var_num) { : argument is of length zero

请帮助我了解如何纠正此问题并实现我的要求。

YOL*_*OLO 7

正如评论中所建议的,您可以for-set在 data.table 中使用组合来进行更快的插补:

for(k in names(df1)){

      if(k %in% var_num){

        # impute numeric variables with median
        med <- median(df1[[k]],na.rm = T)
        set(x = df1, which(is.na(df1[[k]])), k, med)

    } else if(k %in% var_char){

        ## impute categorical variables with mode
        mode <- names(which.max(table(df1[[k]])))
        set(x = df1, which(is.na(df1[[k]])), k, mode)
    }
}
Run Code Online (Sandbox Code Playgroud)