R语言学习笔记
提示:本文数据rate2019.sav已上传到资源
文章目录
箱线图
setwd("E:/00大三/201风险建模的统计方法/220308") #数据路径,需更改!!!
install.packages("readr") #安装包
library(Hmisc)#加载包
library(readr)#加载包
#===========================导入数据===2019===========================================
SAV.rate2019<-spss.get("rate2019.sav") #导入数据,标签。需要加载Hmisc包。
ls(SAV.rate2019) #看变量名
attach(SAV.rate2019)
describe(region1) #描述统计。需要加载Hmisc包。其他类似函数有summary(length、class和mode),list(列出全部),head(列出前几个)
#======================================求四分位点======================================
##结果储存的准备工作
name.row<-c(" ","25%分位点","中位数","75%分位点" ," ") #结果的行名称
name.col<-c("Type1","Type2","Type3","Type4","Type5","Type6","Type7","Type8","Type9","Fivenum","Boxplot") #结果的列名称,不能用中文,可能会错(如何能正确输出欸?)
list.name<-list(name.row,name.col) #由行名称、列名称组成的列表
NUM.row<-5 #
##EC, East Asia & Pacific
data.EC<-subset(SAV.rate2019,region1=="EC") #数据取子集 筛选数据
result.EC<-matrix(data=NA,nrow=5,ncol=11,byrow=FALSE,dimnames = list.name) #用于存储结果,5行11列,按列填充
for(i in 1:9){ result.EC[,i]<-quantile(data.EC$rate2019,probs=c(0,0.25,0.5,0.75,1),type=i)} #循环,得出5×9个数值,9个quantile的结果
result.EC[,10]<-fivenum(data.EC$rate2019) #第10列是五数fivenum的结果
result.EC[,11]<-boxplot(data.EC$rate2019)$stats#第11列是箱线图的结果
?quantile
##EP,Europe & Central Asia #后续三个都和EC相同方法
data.EP<-subset(SAV.rate2019,region1=="EP") #数据取子集 筛选数据
result.EP<-matrix(data=NA,nrow=5,ncol=11,byrow=FALSE,dimnames = list.name) #用于存储结果,5行11列,按列填充
for(i in 1:9){ result.EP[,i]<-quantile(data.EP$rate2019,preb=c(0,0.25,0.5,0.75,1),type=i)} #循环,得出5×9个数值
result.EP[,10]<-fivenum(data.EP$rate2019) #第10列是五数fivenum的结果
result.EP[,11]<-boxplot(data.EP$rate2019)$stats #第11列是箱线图的结果
##LC,Latin America & Caribbean
data.LC<-subset(SAV.rate2019,region1=="LC") #数据取子集 筛选数据
result.LC<-matrix(data=NA,nrow=5,ncol=11,byrow=FALSE,dimnames = list.name) #用于存储结果,5行11列,按列填充
for(i in 1:9){ result.LC[,i]<-quantile(data.LC$rate2019,preb=c(0,0.25,0.5,0.75,1),type=i)} #循环,得出5×9个数值
result.LC[,10]<-fivenum(data.LC$rate2019) #第10列是五数fivenum的结果
result.LC[,11]<-boxplot(data.LC$rate2019)$stats #第11列是箱线图的结果
##MN,Middle East & North Africa
data.MN<-subset(SAV.rate2019,region1=="MN") #数据取子集 筛选数据
result.MN<-matrix(data=NA,nrow=5,ncol=11,byrow=FALSE,dimnames = list.name) #用于存储结果,5行11列,按列填充
for(i in 1:9){ result.MN[,i]<-quantile(data.MN$rate2019,preb=c(0,0.25,0.5,0.75,1),type=i)} #循环,得出5×9个数值
result.MN[,10]<-fivenum(data.MN$rate2019) #第10列是五数fivenum的结果
result.MN[,11]<-boxplot(data.MN$rate2019)$stats #第11列是箱线图的结果
#======================================结果======================================
list.RESULT<-list(EC=result.EC,EP=result.EP,LC=result.LC,MN=result.MN) #汇总结果
list.RESULT
#======================================结果导出======================================
##结果导出到csv文件"作业结果1.csv"
write.csv(list.RESULT[[1]],file="EC.csv") #但结果是一长行,没办法整成一个漂亮的方块,于是尝试使用另一方法
write.csv(list.RESULT[[2]],file="EP.csv")
##另一方法,导出到"作业结果2.csv"
#需要加载readr包
RE.EC<-data.frame(result.EC) #矩阵转成data.frame
RE.EP<-data.frame(result.EP)
RE.LC<-data.frame(result.LC)
RE.MN<-data.frame(result.MN)
rep("EC",5)
write_csv(RE.EC,file="作业结果2.csv",col_names=T) #这个函数的问题,一是显示不了行名,二是没办法写入汉字→所以没办法写入空行,顶多写入一行0。
write_csv(RE.EP,file="作业结果2.csv",append = TRUE) #所以这两列会有点分不清,令人难过
write_csv(RE.LC,file="作业结果2.csv",append = TRUE) #而且必须是data.frame
write_csv(RE.MN,file="作业结果2.csv",append = TRUE) #难道就没有好看的函数了吗!
#============检验前10列哪一种方法的的四分位点==和boxplot的相同===============================
a<-c(1:4)*0 #结果储存在a里面
for(i in 1:10)
{
if(result.EC[2,i]==result.EC[2,11] & result.EC[3,i]==result.EC[3,11] & result.EC[4,i]==result.EC[4,11]){
a[1]=i}
} #EC
for(i in 1:10)
{
if(result.EP[2,i]==result.EP[2,11] & result.EP[3,i]==result.EP[3,11] & result.EP[4,i]==result.EP[4,11])
a[2]=i
} #EP
for(i in 1:10)
{
if(result.LC[2,i]==result.LC[2,11] & result.LC[3,i]==result.LC[3,11] & result.LC[4,i]==result.LC[4,11])
a[3]=i
} #LC
for(i in 1:10)
{
if(result.MN[2,i]==result.MN[2,11] & result.MN[3,i]==result.MN[3,11] & result.MN[4,i]==result.MN[4,11])
a[4]=i
} #MN
a #结果,分别代表EC、EP、LC、MN
#都是第10列和第11列的四分位数,也就是fivenum列和boxplot的四分位数相同
#===========================计算==异常值点===上下触须极值===============================
#使用fivenum结果(fivenum结果存储在第10列,第二行为25%,第三行50%,第四行75%)
name.row.extre<-c("EC","EP","LC","MMN") #上下触须行名称
name.col.extre<-c("LOW","UP") #上下触须列名称
list.name.extre<-list(name.row.extre,name.col.extre) #由行名称、列名称组成的列表
RESULT.extre<-matrix(data=NA,nrow=4,ncol=2,byrow=FALSE,dimnames = list.name.extre) #用于储存上下触须极值的4×2矩阵
#=====EC==========
attach(data.EC)
IQR<-result.EC[4,10]-result.EC[2,10]
max<-max(rate2019) #最大值
min<-min(rate2019) #最小值
up<-result.EC[4,10]+1.5*IQR #判断上界
low<-result.EC[2,10]-1.5*IQR #判断下界
if(up >= max & low <= min){
print("无异常值")
RESULT.extre[1,1]=min
RESULT.extre[1,2]=max
}else{
newdata<-rate2019[ rate2019<=min(max,up) & rate2019>=max(min,low)] #这是去掉异常值之后的数据
RESULT.extre[1,1]=min(newdata) #第一行是EC,第一列是下触须
RESULT.extre[1,2]=max(newdata) #第二列是上触须
out.EC<-rate2019[ rate2019>min(max,up) | rate2019<max(min,low)] #异常值
}
rrr<-rate2019[order(rate2019,decreasing=F),]
match(rate2019[rate2019>up|rate2019<low] ,rate2019) #这个是输出异常值点在第几个位置,但是需要排序
detach(data.EC)
?match
#=====EP==========
attach(data.EP)
IQR<-result.EP[4,10]-result.EP[2,10]
max<-max(rate2019) #最大值
min<-min(rate2019) #最小值
up<-result.EP[4,10]+1.5*IQR #判断上界
low<-result.EP[2,10]-1.5*IQR #判断下界
if(up >= max & low <= min){
print("无异常值")
RESULT.extre[2,1]=min
RESULT.extre[2,2]=max
out.EP<-NA
}else{
newdata<-rate2019[ rate2019<=min(max,up) & rate2019>=max(min,low)] #这是去掉异常值之后的数据
RESULT.extre[2,1]=min(newdata) #第二行是EP,第一列是下触须
RESULT.extre[2,2]=max(newdata) #第二列是上触须
out.EP<-rate2019[ rate2019>min(max,up) | rate2019<max(min,low)] #异常值
}
detach(data.EP)
#=====LC==========
attach(data.LC)
IQR<-result.EC[4,10]-result.EC[2,10]
max<-max(rate2019) #最大值
min<-min(rate2019) #最小值
up<-result.LC[4,10]+1.5*IQR #判断上界
low<-result.LC[2,10]-1.5*IQR #判断下界
if(up >= max & low <= min){
print("无异常值")
RESULT.extre[3,1]=min
RESULT.extre[3,2]=max
}else{
newdata<-rate2019[ rate2019<=min(max,up) & rate2019>=max(min,low)] #这是去掉异常值之后的数据
RESULT.extre[3,1]=min(newdata) #第三行是LC,第一列是下触须
RESULT.extre[3,2]=max(newdata) #第二列是上触须
out.LC<-rate2019[ rate2019>min(max,up) | rate2019<max(min,low)] #异常值
}
detach(data.LC)
#=====MN==========
attach(data.MN)
IQR<-result.EC[4,10]-result.EC[2,10]
max<-max(rate2019) #最大值
min<-min(rate2019) #最小值
up<-result.MN[4,10]+1.5*IQR #判断上界
low<-result.MN[2,10]-1.5*IQR #判断下界
if(up >= max & low <= min){
print("无异常值")
RESULT.extre[4,1]=min
RESULT.extre[4,2]=max
}else{
newdata<-rate2019[ rate2019<=min(max,up) & rate2019>=max(min,low)] #这是去掉异常值之后的数据
RESULT.extre[4,1]=min(newdata) #第四行是MN,第一列是下触须
RESULT.extre[4,2]=max(newdata) #第二列是上触须
out.MN<-rate2019[ rate2019>min(max,up) | rate2019<max(min,low)] #异常值
}
detach(data.MN)
RE.extre<-data.frame(RESULT.extre) #上下触须的结果 转为数据框,用于写入之前的"作业结果2.csv"
write_csv(RE.extre,file="作业结果2.csv",append = TRUE) #不知道为啥标题写不进去,就反正,四行分别是EC、EP、LC、MN,第一列是下触须,第二列是上触须
#*****异常值写入数据*****
list.out<-list(EC=out.EC,EP=out.EP,LC=out.LC,MN=out.MN) #这是所有的异常值,现在要努力把它转成data.frame从而写入csv
max.length<-0 #用于储存最多的那个异常值的个数,从而生成矩阵
for(i in 1:4){
l=length(list.out[[i]])
if(max.length<l)max.length=l
}
#****先转为矩阵
RESULT.out<-matrix(data=NA,nrow=4,ncol=max.length,byrow=FALSE) #用于储存异常值的4×m矩阵,m=max.length
for(i in 1:4){
j<-length(list.out[[i]]) #j是第i行的长度
RESULT.out[i,1:j]=unlist(list.out[[i]]) #必须加1:j,不然报错“ 被替换的项目不是替换值长度的倍数”
}
#****转为数据框并写入
RE.out<-data.frame(RESULT.out) #上下触须的结果 转为数据框,用于写入之前的"作业结果2.csv"
write_csv(RE.out,file="作业结果2.csv",append = TRUE) #四行分别是EC、EP、LC、MN
par(mfrow=c(2,2)) #2行2列显示
boxplot(data.EC$rate2019,main="EC") #画箱线图
boxplot(data.EP$rate2019,main="EP")
boxplot(data.LC$rate2019,main="LC")
boxplot(data.MN$rate2019,main="MN")