您的位置:首页 > 其它

R语言-数据预处理的一些实用(万能)办法:缺失值、数据重复、共线性等等的处理

2016-12-09 13:02 330 查看
#在这里呢主要是想介绍一下数据预处理的一些常用问题:缺失值、数据重复、共线性等等的处理办法,自己写了一点代码,希望能帮助到有需要的朋友

#删除缺失比例达到20%的列,并打印出删除的列

fun1<-function(data,naratio=0.2){

  na_ratio<-apply(is.na(data),2,sum)/nrow(data)#求每列的缺失比例

  x<-data[,na_ratio<naratio]#保留缺失比例小于0.2的列

  print(colnames(data)[na_ratio>=naratio])#打印出被删除的列变量名

  return(x)

}

#或者可以直接利用R中的DMwR包来进行处理

library(DMwR)

data4<-data[-manyNAs(data,nORp=0.2),] #删除缺失比例达到20%(默认0.2)的行(如果想删除列先将矩阵进行转置就行了)

#删除某列众数比例达到50%的列,并打印出删除的列

fun2<-function(data){

  fun_const<-function(x){ 

    xn1<-which.max(table(x))#找出每列的众数

    return(x[xn1])

  }

  constant1<-as.numeric(apply(data,2,fun_const))

  fun_i<-function(data,constant1,i){

    zero_ratio<-sum(data[,i]==constant1[i])/nrow(data)

    return(zero_ratio)

  }

  zero_ratio1<-numeric(ncol(data))

  

  for(i in 1:ncol(data)){

    zero_ratio1[i]<-fun_i(data,constant1,i)

  }

  data1<-data[,zero_ratio1<0.5]

  print(colnames(data)[zero_ratio1>=0.5])

  return(data1)

}

#删除相关系数达到0.9的列,并打印出删除的列

fun3<-function(data,corr=0.9){

  xc<-cor(data);diag(xc)=0

  lc<-which(abs(xc)>=corr,arr.ind = T)

  if(length(lc)!=0){

    lc1<-lc[lc[,1]<lc[,2],]

    if(is.matrix(lc1)) lcd<-unique(lc1[,2]) else lcd<-lc1[2]

    x<-data[,-lcd]

    print(colnames(data)[lcd])

    return(x)

  } else return(data)

}

#删除列名重复的情形(可能列名只是差个空格或者其他符号,但其实是同一个变量)

col_name<-colnames(data)

col_name1<-gsub(" ","",col_name)#删掉变量名中的空格

new_col<-unique(col_name1)

data1<-data[,match(new_col,col_name1)]
#其实这些都是平时做数据处理时可以预先做的一些简单处理,还是非常实用的,但是我只是针对自己的数据编写的,如果数据不一样会出现一些小问题,只要稍微做下修改应该就没啥问题,有好办法欢迎来贴,只有互相学习才能更快的提升自己!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息