# 1、构建测试数据
tt<-attenu #存在缺失值
tt<-rbind(tt,tt[100:105,]) #构建重复值
tt[78,2]<-tt[79,3] #多列缺失值
tt[20,2]<-100 # 异常值
# 2、重复项处理
# 方法1
# 删除选定列重复项
ss<-tt[!duplicated(tt[,c(3)]),]
# 删除全部列重复项
ss<-tt[!duplicated(tt, fromLast=F),]
ss<-unique(tt,fromLast=FALSE)
#fromLast=FALSE,即重复记录,保留首次出现的;否则取最后一次出现的
# 方法2
data<-c("hao","hao","hao","good")
data1<-data.frame(r1=c("aa","aa","ab","aa"),r2=c("aa","ab","bc","aa"))
unique(data) #去掉重复项
duplicated(data) #识别重复项,返回逻辑值
unique(data1) #去掉重复项
duplicated(data1) #识别重复项,返回逻辑值
# 3、格式转换
data$field<-as.numeric(data$field) #数值转换
data$field<-as.factor(data$field) #因子转化
for (i in 1:25) { data[,i] <- as.numeric(as.vector(data[,i])) } #循环技术进行各列数据类型转化
# 4、异常值
dotchart(tt$mag) #观察 散点图
boxplot(tt$mag, horizontal = TRUE) #观察 散点图
ss<-tt[order(-tt$mag),]; head(ss) #观察 排序
ss<-tt[-which(tt$mag>50),] # 删除 异常值
tt$mag[tt$mag>50]<-NA # 替换异常值
ss<-tt; ss$mag[ss$mag>50]<-NA # 替换异常值为NA
#其他:如果是多维度异常情况,思路是聚类技术等
# 5、缺失值
# 描述
# 描述1
install.packages("mice")
library(mice)
md.pattern(tt)
# 描述2
install.packages("VIM")
library(VIM)
aggr(tt,prop=T,number=T)
#prop=T显示占比,prop=F显示数量
#number=T显示数值
# 缺失值处理
# 删除 指定列缺失值
ss<-tt[-which(is.na(tt$station)),] # 指定1列
ss<-tt[complete.cases(tt[,2:3]),] # 指定多列
# 删除 全部缺失值行
ss<-na.omit(tt)
summary(ss)
# 替换
mean(tt$station) # 均数
median(tt$station) # 中位数
table(ss$station)[table(ss$station)==max(table(ss$station))] # 众数
# 插补---等待学习
# 思路1、通过构建模型进行插补
# 思路2、通过各种可能性的插补值,然后分析对应的方向数据,通过评估进行选择
识别缺失数据的数目、分布和模式有两个目的:
(1)分析生成缺失数据的潜在机制;
(2)评价缺失数据对回答实质性问题的影响。
即:
(1)缺失数据的比例有多大?
(2)缺失数据是否集中在少数几个变量上,抑或广泛存在?
(3)缺失是随机产生的吗?
(4)缺失数据间的相关性或与可观测数据间的相关性,是否可以表明产生缺失值的机制呢?
若缺失数据集中在几个相对不太重要的变量上,则可以删除这些变量,然后再进行正常的数据分析;
深挖:缺失值的插补问题、缺失值缺失机制研究
# 6、数据赋值、增减变量
数据赋值、增减变量
y[which(y<1.5)] <- 1
data$is_do <- ifelse(data$is_do > 0.7 ,2,ifelse(data$is_do > 0.3 ,1,0))
q1_AGE<-quantile(data$AGE, 0.03,na.rm=TRUE) #data数据表中维度AGE从小到大排序前3%处数值
q2_AGE<-quantile(data$AGE, 0.97,na.rm=TRUE) #data数据表中维度AGE从小到大排序前97%处数值
data$AGE <- ifelse(data$AGE < q1_AGE,q1_AGE,data$AGE)
data$AGE <- ifelse(data$AGE > q2_AGE,q2_AGE,data$AGE)
data <- data[names(data) %in% c("CN_EFF_DATE", "CN_EXP_DATE")] #选取data数据表中字段CN_EFF_DATE、CN_EXP_DATE
data <- data[!(names(data) %in% c("CN_EFF_DATE", "CN_EXP_DATE"))] #删除data数据表中字段CN_EFF_DATE、CN_EXP_DATE
# 7、数据重编码
方法1
leadership$age[leadership$age == 99] <- NA
leadership$agecat[leadership$age > 75] <- "Elder"
leadership$agecat[leadership$age >= 55 & leadership$age <= 75] <- "Middle Aged"
leadership$agecat[leadership$age < 55] <- "Young"
方法2
leadership <- within(leadership,{
age[age==99] <-NA
agecat[age > 75] <- "Elder"
agecat[age >=55 & age <=75] <- "Middle Aged"
agecat[age < 55] <- "Young" })
方法3
age_new<-c()
for (i in 1:length(data$AGE)){
if(data$AGE[i]>=0&data$AGE[i]<18)
{age_new[i]<-'少年'}
if(data$AGE[i]>=18&data$AGE[i]<30)
{age_new[i]<-'青年'}
if(data$AGE[i]>=30&data$AGE[i]<60)
{age_new[i]<-'壮年'}
if(data$AGE[i]>=60)
{age_new[i]<-'老年'}
}
方法4
library(plyr)
mutate(ss,le=nchar(x))
方法5
library(plyr)
summarise(train,median_price = median(price))
方法6
transform {base}
transform(ss,le=nchar(x))
# 8、数据抽取、抽样
data<- data[which(data[,11]==1),] #选取data数据表里第11列维度为1的数据
data<-data[sample(nrow(data),10000),] #随机从数据集data中选取10000条纪录
number=sample(nrow(data),1/4*nrow(data)) #计算数据集data样本量1/4的数值
train_example=data[number,] #对数据集data随机抽样number个数
train_sub=sample(nrow(train_example),3/4*nrow(train_example))
train_data=train_example[train_sub,]
test_data=train_example[-train_sub,]
dim(train_data)
dim(test_data)
# 同时筛选包含多个分类的子数据
#方法1:
result <- aa[aa$ID %in% selectedID,]
#方法2:
library(dplyr)
result <- filter(aa,aa$ID %in% selectedID)
train %>% filter(cat2 %in% c(ss$cat2)) %>% select(c("cat1","cat2","cat")) %>% head(2)
# 9、排序
ss<-tt[order(-tt$mag,tt$cyl),] # 针对数据框
ss<-arrange(mtcars,cyl,desc(disp)) # 针对数据框
ss<-sort(tt$mag) # 针对向量
reorder(x,y,FUN) # 针对向量,x按照y进行排序,并且结构FUN施加到得到的x每一个子集上
# 10、数据0-1化、标准化
b1=(p[,1]-min(p[,1]))/(max(p[,1])-min(p[,1])) #0-1化处理
ss<-scale(tt[,-3]) #标准化处理
# 11、合并
mm<-cbind(tt,ss) #列合并,即变量合并
tt<-rbind(tt,tt[100:105,]) #行合并,即记录合并
# 12、分组统计
apply(mtcars,MARGIN=1,sum) # MARGIN=1按行计算,MARGIN=2按列计算
tapply(tt$disp,tt$cyl,sum) # 对disp列,按cyl分组,进行sum操作
aggregate(tt$disp,by=list(tt$cyl),sum) # 对disp列,按cyl分组,进行sum操作
# 13、日期处理
# 转化为标准日期格式:Date,"2009-01-01"
# 方法1:
library(lubridate)
train$date = dmy(train$date)
# 此外还有ydm,ymd,myd,mdy,dmy,dym,合计6个函数可以将字符转化为标准日期格式:Date,"2009-01-01"
# 方法1:
as.Date("2007.2.1", "%Y.%m.%d") # 将固定格式的日期数据,转化为标准日期格式:Date,"2009-01-01"
# 获取时间信息
date() # 获取当前日期,返回的是字符串类型:"Sun Jun 17 11:45:59 2018"
Sys.Date() #获取当前日期:"2018-06-17"
format(Sys.Date(),format="%Y") # 年:"2018"
format(Sys.Date(),format="%m") # 月:"06"
format(Sys.Date(),format="%d") # 日:"17"
weekdays(Sys.Date()) # 取日期对象所处的周几:"星期日"
months(Sys.Date()) # 取日期对象的月份:"六月"
quarters(Sys.Date()) # 取日期对象的季度:"Q2"
# 另外,也可以:
library(lubridate)
year(Sys.Date())
month(Sys.Date())
day(Sys.Date())
# 特定格式输出
format(Sys.Date(),format="%Y/%m/%d") #特定格式输出
# 日期相减
# 方法1:
days<-as.Date("2018-06-17")-as.Date("2018-06-01")
# 方法2:
difftime(as.Date("2018-06-02"),as.Date("2018-06-1"),units="hours")
# units的参数可以是:"secs", "mins", "hours","days", "weeks"
格式 | 意义 |
%d | 月份中当的天数 |
%m | 月份,以数字形式表示 |
%b | 月份,缩写 |
%B | 月份,完整的月份名,指英文 |
%y | 年份,以二位数字表示 |
%Y | 年份,以四位数字表示 |