1.选择数据,(1)可使用中括号,第一项为行(行号),第二项为列(列号)。行可设置为筛选条件(==作为筛选也可以用which(==)),列可用c函数或:连接选择多列。
setosa.data=iris[1:5,c('Sepal.Length','Sepal.Width')]
(2)subset函数来查。参数,第一个为数据集,第二个参数为条件,选择行,第三参数select=是选择列。
ex.data=subset(iris,petal.length<=1.4 & petal.width>=0.2,select=Species)
2.合并数据,将两个具有相同列或行的数据框合并为一个,合并后列名为species.
flower.type=data.frame(species='setosa',flower='iris')
merge(flower.type,iris[1:3,],by='species')
3.数据排序。返回指定列进行数据排序后的数据框。
iris[order(iris$sepal.length,decreasing=TRUE),]
4.统计计算。对数据框的每个数值型属性进行汇总统计,使用sapply函数。
sapply(iris[1:4],mean,na.rm=TRUE)#忽略缺失值
cor(iris[,1;4]);cov(iris[,1;4]);cor.test(),t.test()
计算不同组数据的聚合汇总统计,使用aggregate和reshape函数来计算数据子集的汇总统计。
aggregate(x=iris[,1:4],by=list(iris$species),FUN=mean)
library(reshape)
iris.melt=melt(iris,id='species')
cast(Species~variable,data=iris.melt,mean,subset=Species %in% c('setosa','versicolor'),magins='grand_row')
#合并加去重
#附加, 横或竖合并数据: append,cbind,rbind
x=1:10;x;x[12]=3;x
(x1=append(x,77,after=5))#在第五个之后,即第6个是77
cbind(1:5,rnorm(5))
rbind(1:5,rnorm(5))
(x=rbind(1:5,runif(5),runif(5),1:5,7:11))
x[!duplicated(x),]#去掉矩阵重复的行
unique(x)#和上一个用法一样,返回的也是不同行的矩阵
#tapply对列表进行计算,apply对矩阵进行计算列联表,可绘制马赛克图
ftable=table(Sex, Age)
mosaicplot(ftable,color=TRUE)
chisq.test(ftable)###皮尔森卡方检验,用于发现两个类别变量之间是否存在某种关联,大数据中非成组信息的检验。包含两个或两个以上独立数据组。原假设是变量1和变量2相互独立。p值小于0.05,说明不独立。
tapply(Days, list(Sex, Age), mean)#按照age、sex对天数求均值
na.omit(airquality)#删去缺失值的数据
#添加分类新变量
cars$qspeed=cut(cars$speed, breaks=quantile(cars$speed),include.lowest = TRUE) #增加一个定性变量qspeed, 以四分位点为分界(四分位点计算:i(n+1)/4,离谁近,权数大,q1=0.25*第十二项+0.75*第十三项)
names(cars) #数据cars多了一个变量(可以把每一行数据放到一类里面,求三个分位点,把数据分为四类)
plot(dist ~ qspeed, data = cars)#连续和分类变量可以画出箱线图
(a=lm(dist ~ qspeed, data = cars))#拟合线性模型(简单最小二乘回归)
abline(a,col="red")#或者abline(lm(y~x),col="red")在散点图上加拟合直线
summary(a)#回归结果(包括一些检验)sum(x);length(x)#元素和及向量元素个数
fivenum(x) # 五数汇总, quantiles
quantile(x) # 分位点 quantiles (different convention)有多种定义
quantile(x, c(0,.33,.66,1))
(a=factor(letters[1:10])) #letters为小写字母的向量, LETTERS为大写字母
a[3]="w" #不行! 会给出警告,把w赋值给a[3]
a=as.character(a) #转换一下
a[3]="w" #可以了
a;ss=factor(a) #两种不同的类型[1] a b w d e f g h i j
#Levels: a b d e f g h i j w
levels(ss);nlevels(ss)#(查看分类个数)(factor是将字符向量变为分类变量,也可以将数值类型变为分类变量)
as.numeric(f)#将分类化为数值
(z=seq(10,-1,-0.1))#10到-1间隔为-0.1的序列
(x=rep(1:3,3)) #三次重复1:3
(x=rep(3:5,1:3))#3 4 4 5 5 5
(x=rep(c(1,10),c(4,5)))#11 1 1 10 10 10 10 10
x=matrix(rnorm(24),4,6);x
x[x[,1]>0,1] #第1列大于0的元素
sum(x[,1]>0) #第1列大于0的元素的个数
x[,-c(1,3)]#没有第1、3列的x.
diag(1:5) #以1:5为对角线,其它元素为0的对角线矩阵
diag(5) #5维单位矩阵(对角为1,其他为0)
###画图
x=seq(-3,3,len=20);y=dnorm(x)#产生数据
w= data.frame(x,y)#合并x,y,成为数据w
par(mfcol=c(2,2))#准备画四个图的地方
plot(y ~ x, w,main="正态密度函数")
plot(y ~ x,w,type="l", main="正态密度函数")#实线不加点
plot(y ~ x,w,type="o", main="正态密度函数")#加点
plot(y ~ x,w,type="b",main="正态密度函数")#虚线
par(mfcol=c(1,1))#取消par(mfcol=c(2,2))
plot(1,1,xlim=c(1,7.5),ylim=c(0,5),type="n") #画出框架
#在plot命令后面追加点用points()(如要追加线可用lines()函数):
points(1:7,rep(4.5,7),cex=seq(1,4,l=7),col=1:7, pch=0:6)
text(1:7,rep(3.5,7),labels=paste(0:6,letters[1:7]),cex=seq(1,4,l=7),
col=1:7)#在指定位置加文字
points(1:7,rep(2,7), pch=(0:6)+7)#点出符号7到13
text((1:7)+0.25, rep(2,7), paste((0:6)+7))#加符号号码
points(1:7,rep(1,7), pch=(0:6)+14) #点出符号14到20
text((1:7)+0.25, rep(1,7), paste((0:6)+14)) #加符号号码
plot(Sepal.Length,Sepal.Width,type="l")#(描点,连线)
plot(Species)#plot是泛型函数,会根据输入自动调整输出。(条形图,每种分类的频数)
plot(Species,Sepal.Length);boxplot(Sepal.Length~Species)#箱线图,显示分类变量中数值变量的中位数
#指数分布E(0.5)
x=seq(0,10,len=1000)
y=dexp(x,0.5)
plot(y~x,ty="l",xlab="商品",ylab="销量")#(纵轴是0~0.5,横轴是0~10)
##lines是可以加到plot上的
xx=seq(2,10,len=1000)
yy=dexp(xx,0.5)
lines(xx,yy,ty="h",col="pink")#(纵轴是0~0.5,横轴是0~10,粉红色是从2~10)
#三维图像
z=cos(y)/(1+x^2)
x=seq(-2,2,len=100)
y=seq(-pi,pi,len=100)
z=function(x,y) cos(y)/(1+x^2)
z=outer(x,y,z)
persp(x,y,z,theta=30,phi=30,expand=0.7,col="pink")
#第一个角度仰角,左右转,拉扁拉宽
#双纵轴
drunkenness <- ts(c(3875, 4846, 5128, 5773, 7327,
6688, 5582, 3473, 3186,
rep(NA,51)),
start=1912, end=1971)
drunkenness
# Have to copy-and-paste to shrink the mtext text (arggh!)
par(mar=c(3, 6, 2, 4))
plot(drunkenness, lwd=3, col="gray", ann=FALSE, las=2)
mtext("Drunkenness\nRelated Arrests", side=2, line=3.5, cex=0.7)
par(new=TRUE)
plot(nhtemp, ann=FALSE, axes=FALSE)
mtext("Temperature (F)", side=4, line=3, cex=0.7)
title("Using par(new=TRUE) or par(usr=...)")
axis(4)
par(new=FALSE)
#饼状图、柱状图、直方图
attach(cars);head(cars)##检测缺失值;计算缺失比例(计算的是age这一列)
sum(is.na(train.data$Age)==TRUE);sum(is.na(train.data$Age)/length(train.data$Age)
##用sapply函数来计算所有属性缺失值的比例
sapply(train.data,function(df){
sum(is.na(df)==TRUE)/length(df) ;
})
##用Amelia包对缺失数据进行可视化处理。
install.packages("Rcpp");library(Rcpp);install.packages("Amelia");library(Amelia);
#使用missmap函数绘制缺失值示意图。
missmap(train.data,main="missing map")
#插补缺失值
train.data$x1[which(is.na(train.data$x1))]='s'
table(train.data$x1,useNA="always")
###可视化数据精华
(1)分类变量的频数画图
barplot(table(train.data$Survived),main="Passenger Survival",names=c("Perished","Survived")#画向量,分类变量的柱状图(2)分类变量在分类变量的的分布画图
##棘状图barplot什么样性别的乘客在沉船事故中丧生概率更大;船舱等级是否对逃生概率有影响等这些问题。
counts=table(train.data$Survived,train.data$Sex)
barplot(counts,col=c("darkblue","red"),legend=c("Perished","Survived"),main="passenger survived by sex")
#多分类变量的关联,还可以用vcd包中的mosaicplot函数。
mosaicplot(train.data$Sex~train.data$Survived,main="lalal",color=TRUE,xlab="Sex",ylab="Survived")
##连续变量(年龄)在分类变量是死还是活上的直方图对比。
hist(train.data$Age[which(train.data$Survived=='0')],main="lallala",xlab="Age",ylab="Count",col="blue",breaks=seq(0,80,by=20))
hist(train.data$Age[which(train.data$Survived=='1')],col="red",add=T,breaks=seq(0,80,by=20))
(4)两个连续变量的散点图随着分类变量的变化。coplot()函数在散点图的基础上,加入了一至两个因子,可以做出散点图随因子变化的情况。首先考虑一个因子的情况,有a、b、c三个变量,现在是想考察变量a和变量b是如何根据作为变量c的变化而变化的,等同于把c看做是因子变量
coplot(Sepal.Width~Sepal.Length|Species)#(不同分类下,length为横轴的三个散点图)
(5)#箱线图,显示分类变量中数值变量的中位数
plot(Species,Sepal.Length);boxplot(train.data$Age~train.data$Survived,xlab="Survived",ylab="Age")
(6)双纵轴例子,
y1=data.frame(t,v1)
y2=data.frame(t,x1)
y3=data.frame(t,v2)
y4=data.frame(t,x2)
par(mfcol=c(2,1))#布置2行一列的两个图。退出用par(mfcol=c(1,1))
par(mar=c(3, 6, 2, 4))
plot(y1, lwd=0, col="blue", ann=FALSE, las=1)
mtext("定速速度", side=2, line=3.5, cex=1)
par(new=TRUE)#继续往图上加图退出用par(new=FALSE)
plot(y2, ann=FALSE, axes=FALSE)
mtext("定速距离", side=4, line=2, cex=1)
title("定速时时间与速度和距离的曲线图")
axis(4)
par(new=FALSE)
(7)词云图
library(rJava)
library(Rwordseg)
library(RColorBrewer)
library(wordcloud)
library(wordcloud2)
textseg = read.csv("C:/Users/Administrator/Desktop/背景.txt",header=F)
wordfre = NULL
for (i in 1:dim(textseg)[1]){
textsegment=as.character(textseg[i,])
seg = segmentCN(textsegment)
wordfre=c(wordfre,seg)
}
word.frequent = table(wordfre)
WORD.frequent = as.data.frame(word.frequent)
lenword = apply(WORD.frequent,1,nchar)
WORD.frequent = WORD.frequent[lenword[1,]!=1,]
WORD.frequent_sort = sort(WORD.frequent[,2],decreasing=T,index.return=T)
set.seed(100)
wordcloud(WORD.frequent$wordfre[WORD.frequent_sort$ix[1:100]],
WORD.frequent_sort$x[1:100],random.order=F,
colors=colors(7))
wordcloud(WORD.frequent$wordfre[WORD.frequent_sort$ix[1:100]],
WORD.frequent_sort$x[1:100],random.order=T,colors=colors(7))
wordcloud2(demoFreq,shape='')
#决策树分类(例子为条件推理树)
#先构建划分函数用其他算法也可以用
split.data=function(data,p=0.7,s=666){
set.seed(s)
index=sample(1;dim(data)[1])
train=data[index[1:floor(dim(data)[1]*p)],]
test=data[index[((ceiling(dim(data)[1]*p))+1):dim(data)[1]],]
return(list(train=train,test=test))
}
#划分训练数据集和测试数据集train.data是上节用过的一个数据集,不要和训练数据集搞混。
allset=split.data(train.data,p=0.7)
trainset=allset$train
testset=allset$test
##加载相关包。
install.packages("party")
require("party")
train.ctree=ctree(Survived~sex+age+....,data=train.set);train.ctree
plot(train.ctree)#从决策树结果中可看出结果
###支持向量机svm
install.packages("e1071")
require(e1071)
svm.model=svm(Survived~sex+age+....,data=train.set,probablity=TRUE)
##模型评估混淆矩阵
ctree.predict(train.ctree,testset)
##安装和导入caret包(还可以进行数据分别,普通预处理,构建哑变量,训练使用交叉验证,常规可视化)
install.packages("caret)
require(caret)
confusionMatrix(ctree.predict,testset$Survied)#看准确度,还可以进行属性调优,或改用glm,随机森林等形成更好的模型。
#使用roc曲线,反映正确预测率和错误预测率之间的关系,曲线下面积越大,即越接近1,模型预测准确度越高。说明简单的条件推理树可以非常好的预测出乘客的逃生概率。
#相关系数矩阵的热力图
library(reshape2)
qplot(x=Var1,y=Var2,data=melt(cor(mtcars[1:3])),fill=value,geom="tile")
#单样本t检验原假设是两个均值是否存在差异,双样本t检验是两个独立的数据集是否不同。
###检验数据正态性,shapiro-wiks检验,p值大于0.05,表示服从正态分布。
单样本k-s检验,p值小于0.05,表示服从正态分布。双样本k-s检验,p值大于0.05,表示两个数据集可能服从同一分布。
wilcoxon检验,不需要两个样本空间为正态分布时,测试表示两个数据集是否服从同一分布。