[转] R 3 数据处理

# 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

年份,以四位数字表示



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值