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
请帮助我了解如何纠正此问题并实现我的要求。
正如评论中所建议的,您可以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)