本人是从2015年4月份开始接触R语言的,那时候我还在上大四,考研复试结果已经出来了,毕业论文也写得差不多了,距离9月份研究生入学还有5个多月的时间,所以就想着利用这段时间干点啥事情,所以就开始一边学车一边准备一下读研需要的基础知识和技能,R语言便是其中之一。说起了惭愧,虽然本人专业是统计学但是在本科阶段却并没有接触过R语言(虽然R语言是统计建模专用语言),本科阶段统计建模和数据分析主要使用的工具是SPSS、SAS,时间序列用EVIEWS,代数和数值计算用MATLAB,运筹学用LINGO。考研复试面试的时候被问到会不会R语言然后一脸懵逼,看来R语言是统计专业学生必备技能之一,所以就买了两本R语言的书开始自学,一本是《R语言实战》一本是暨南大学出版社的《数据统计分析及R语言编程》,是暨大经院统计系王斌会老师主编的一本书,后来想起来考研复试面试时问我R语言问题的好像就是王斌会老师,O(∩_∩)O哈哈~。
实践一:
x=1:100 #把1,2,。。。100个整数向量赋值到x
(x=1:100) #同上,只不过显示出来
sample(x,20) #从1,2,。。。,100中随机不放回地抽取20个值做样本
set.seed(0);sample(1:10,3) #先设随机种子,再抽样
z=sample(1:20000,10000) #从1到20000中不放回抽取10000个样本
z[1:10] #方括号中为向量z的下标
y=c(1,3,7,3,4,2)
z[y] #以y为下标的z的元素值
(z=sample(x,100,rep=T)) #从x中有放回地随机抽取100个值做样本
(z1=unique(z))
length(z1) #z1中不同的元素个数
xz=setdiff(x,z) # x和z之间的不同元素 —— 集合差
sort(union(xz),z) #对xz以及z的并的元素从小到大排序
setequal(union(xz,z),x) #xz以及z的并的元素与x是否一样
intersect(1:10,7:50) #两个数据的交
sample(1:100,20,prob=1:100) #从1:100中不等概率随机抽样,各个数字被抽到的概率与其值成比例
实践二:
pi*10^2 #
"*"(pi, "^"(10,2)) #
pi*(1:10)^-2.3 #可以对向量求指数幂
x=pi*10^2 #
x
print(x) #
(x=pi*10^2) #赋值带打印
pi^(1:5) #指数也可以是向量
print(x,digits=12) #输出x的12位数字
实践三(关于R的对象类型等)
x=pi*10^2 #
class(x) # x的class
typeof(x) # x的type
class(cars) # cars是R中自带的数据
typeof(cars) #cars的type
names(cars) # cars数据的变量名字
summary(cars) # cars的汇总
head(class) # cars的头几行数据,和cars[1:6,]相同
tail(class) # cars的最后几行数据
str(cars) # 也是汇总 ???
row.name(cars) # 行名字
attributes(cars) #cars的一些信息
class(dist~speed) # 公式形式 ,“~”的左边是因变量,右边是自变量
plot(dist~speed,cars) # 两个变量的散点图
plot(cars$speed,cars$dist) # 同上
实践四(包括简单自变量为定变量 及定性变量的回归)
ncol(cars),nrow(cars) #cars的行列数
dim(cars) # cars的维数
lm(dist~speed, data =cars) #一dist为因变量,speed为自变量做OLS,,,
cars$qspeed = cut(cars$speed, breaks=quantile(cars$speed),include.lowest=TRUE) #增加定性变量qspeed,四分点位为分割点
names(cars) #数据cars多了一个变量
cars[3] #第三个变量的值 ,和 cars[,3]类似
table(cars[3]) #列表
is.factor(car$speed) #
plot(dist~speed,data=cars) #点出箱线图
(a=lm(dist~speed, data=cars)) #拟合线性模型(简单最小二乘回归)
summary(a) #回归结果(包括一些检验)
实践五(简单样本描述统计量)
x<-round(runif(20,0,20),digits=2) #四舍五入
summary(x) # 汇总
min(x),max(x) range(x) # 极值 范围
median(x) #中位数
mean(x) #均值
var(x) #方差
sd(x) # 标准差
sqrt(var(x)) #平方根
rank(x) # 秩(rank)
order(x) # 升幂排列的x的下标
order(x,decreasing=T) #降幂排列的x的下标
x[order(x)] #和sort(x) 相同
sort(x,decreasing=T) sort(x,dec=T) #降幂排列的x
sum(x);length(x) #元素和 以及向量的个数
round(x) 等同于round(x,0) 而round(x,5) 表示保留小数点后5位
fivenum(x), # 五数汇总
quantile(x) #分点位 quantiles(different convention)
quantile(x,c(0,.33,.66,1)) #
mad(x)# "median average distance":
cummax(x) #累积最大值
cummin(x) #累积最小值
sumprod(x) #累积积
cor(x,sin(x/20)) #线性相关系数 (correlation)
实践六(简单图形)
x=rnorm(200) #200个随机正态数赋值到x
hist(x, col="light blue") #直方图 histogram
rug(x) #在直方图下面加上实际点的大小
stem(x) # 茎叶图
x<-rnorm(500) #
y<-x+rnorm(500) #构造一个线性关系
plot(y ~x) #散点图
a=lm(y~x) # 做回归
abline(a,col="red") # 加拟合线 同abline(lm(y~x),col="red")
print("Hello world!") #打印
paste("x的最小值= ",min(x)) #
demo(graphics) # 演示画图(点Enter切换)
实践七(复数运算和求函数极值)
(2+4i)^-3.5+(2i+4.5)*(-1.7-2.3i)/((2.6-7i)*(-4+5.1i)) #复数运算
(z<-complex(real=rnorm(10),imaginary=rnorm(10))) #一个10维复向量,实部和虚部均为10个标准正态样本点
complex(re=rnorm(3),im=rnorm(3)) #3维复向量
Re(z) # 实部
Im(z) # 虚部
Mod(z) # 模
Arg(z) # 辐角
choose(3,2) #组合
factorial(6) #排列6!
#解方程:
f=function(x) x^3-2*x-1
uniroot(f,c(0,2)) #迭代求根
#如果知道根为极值
f=function(x) x^2+2*x+1 #定义一个二次函数
optimize(f,c(-2,2)) #在区间(-2,2) 求极值
实践八 (字符型向量)
a=factor(letter[1:10]) #letters:小写字母的向量,LETTERS:大写字母的向量
a[3]="w" #不行,警告!
a=as.character(a) #转换一下
a[3]="w" #可以了
a;character(a) #两种不同的类型
实践九 (数据输入输出)
x=scan() #
x=c( 1.5 , 2.6, 3.7, 2.1, 8.9, 12.0, -1.2, -4.0) #
w=read.table(file.choose(),header=T) #从列表中选择有变量名的数据
setwd("f:/2013stat") set("f:\2013stat") #建立工作路径
(x=rnorm(20)) #给x赋值20个标准正态数据值
write(x,"f:/2013stat/test.txt") #把数据写入文件
y=scan(x,"f:/2013stat/test.txt");y #扫描文件数值数据到y
y=iris;y[1:5,];str(y) #iris是R自带数据
write.table(y,"test.txt",row.name=F) #把数据写入文本文件
w=read.table("f:/2013stat/test.txt",header=T) #读带有变量名的数据
str(w) #汇总
write.csv(y,"test.csv") #把数据写入csv文件
v=read.csv("f:/2013stat/test.csv") #读入csv数据文件
str(v) #汇总
data=read.table("clipboard") #读入剪贴板的数据
实践十(序列)
(z=seq(-1,10,length=100)) # -1到10等间隔的100个数的序列
z=seq(-1,10,length=100) #同上
(z=seq(10,-1,-0.1)) #10到-1间隔为-0.1的序列
(x=rep(1:3,3)) #三次重复1:3
(x=rep(3:5,1:3)) #
x=rep(c(1,10),c(4,5)) #
w=c(1,3,x,z) #w[3]把数据(包括向量)组合成一个向量
x=rep(0,10);z=1:3;x+z #向量加法,警告信息:
In x + z : 长的对象长度不是短的对象长度的整倍数
x*z #乘法
rev(x) #颠倒次序
z=c("no cat ","has","nine","tails") #字符向量
z[1]=="no cat" #逻辑等式
z=1:5 #
z[7]=8;z #
z=NULL #
z[c(1,3,5)]=1:3 #
z #
rnorm(10)[(2,5)] #
z[-c(1,3)] #去掉第1,3个元素
z=sample(1:100,10);z #
which(z==max(z)) #给出最大值的下标
实践十一 (矩阵)
x=sample(1:100,12);x #抽样
all(x>0);all(x!=0);any(x>0);(1:10)[x>0] #逻辑符号的应用
diff(x) #差分
diff(x,lag=2) #差分
x=matrix(1:20,4,5);x #矩阵的构造
x=matrix(1:20,4,5,byrow=T);x #矩阵的构造,按行排列
t(x) #矩阵转置
x=matrix(sample(1:100,20),4,5) #
2*x #
x+5 #
y=matrix(sample(1:100,20),5,4) #
x+t(y) #矩阵之间相加
(z=x%*%y) #矩阵相乘
z1=solve(z) # solve(a,b)可以解ax=b方程
round(z1%*%z,14) #四舍五入
b=solve(z,1:4);b #解联立方程
实践十二 (矩阵继续)
nrow(x),ncol(x),dim(x) #行列数目
x=matrix(rnorm(24),4,6) #
x[c(2,1),] #第2和第1行
x[,c(1,3)] #第1和第3列
x[2,1] #第【2,1】元素
x[x[,1]>0,1] #第1列大于0的元素
sum(x[,1]>0) #第1列大于0的元素的个数
sum(x[,1]<=0) #第1列不大于0的元素的个数
x[,-c(1,3)] #没有第1和3列的x
diag(x) #x的对角线元素
diag(1:5) #以1:5为对角线,其它元素为0的对角线矩阵
diag(5) #5维单位矩阵
x[-2,-c(1,3)] #没有第2行、第1,3列的x
x[x[,1]>0&x[,3]<=1,1] #第1列大于0且第3列小于等于1的第1列元素
x[x[,2]>0|x[,1]<3,1] #第2列大于0或者第1列小于3的第1列元素
x[!x[,2]<3,1] #第1列中 相应于第2列中 >=3的元素
apply(x,1,mean) #对行(第一维)求均值
apply(x,2,sum) #对列(第二维)求和
x=matrix(rnorm(24),4,6) #
x[lower.tri(x)]=0;x #得到上三角阵
x[upper.tri(x)]=0 #得到下三角阵
实践十三 (高维数组)
x=array(runif(24),c(4,3,2)) #用24个服从均匀分布的样本点构造4乘3乘2的3维数组
is.matrix(x)
dim(x) #得到维数
is.matrix(x[1,,])#部分三维数组是矩阵
x=array(1:24,c(4,3,2))
x[c(1,3),,] #
apply(x,1,mean) #可以对部分维做求均值运算
apply(x,1:2,sum) #可以对部分维数做求和运算
apply(x,c(1,3),prob) #对部分维数求乘积
实践十四 (矩阵与向量之间的运算)
x=matrix(1:20,5,4) #5乘4矩阵
sweep(x,1,1:5,"*") #把向量1:5的每个元素乘到每一行
sweep(x,2,1:4,"+") #把向量1:4的每个元素加到每一列
x*1:5 #把向量1:5的每个元素乘到每一行
(x=matrix(sample(1:100,24),6,4));(x1=scale(x)) #
(x2=scale(x,scale=F)) #
(x3=scale(x,center=F)) #
round(apply(x1,2,mean),14) #
apply(x1,2,sd) #
round(apply(x2,2,mean),14);apply(x2,2,sd) #
round(apply(x3,2,mean),14);apply(x3,2,sd) #
实践十六 (缺失值、数据的合并)
airquality #有缺失值(NA)的R自带数据
complete.cases(airquality) #判断每行有没有缺失值
which(complete.cases(airquality)==F) #有缺失值的行号
sum(complete.cases(airquality)) #完整观测值的行数
na.omit(airquality) #删去缺失值的数据
#附加,横或竖合并数据:append,cbind,rbind
x=1:10;x[12]=3 #
(x1=append(x,77,after=5)) #在第5项后面添加 77
cbind(1:5,rnorm(5)) #
rbind(1:5,rnorm(5)) #
cbind(1:3,4:6);rbind(1:3,4:6) #
#去掉矩阵重复的行
(x=rbind(1:5,runif(5),1:5,7:11)) #
x[!duplicated(x),] #
unique(x) #
实践十六(list)
z=list(1:3,Tom=c(1:2,a=list("R",LETTERS[1:5]),W="hi"))
z[[1]];z[[2]]
z$T
z$T$a2
z$T[[3]]
z$T$w
实践十七 (条形图和表)
x=scan()
3 3 3 4 1 4 2 1 3 2 5 3 1 2 5 2 3 4 2 2 5 3 1 4 2 2 4 3 5 2
barplot(x)
table(x)
barplot(table(x))
barplot(table(x)/length(x))
table(x)/length(x)
实践十八(形成表格)
library(MASS) #载入软件包MASS
quine #MASS所带数据
attach(quine) #把数据变量的名字放入内存
#下面是从该数据得到的各种表格
table(Age) #
table(Sex,Age); #
tab=xtabs(~Sex+Age,quine); #
unclass(tab) #
tapply(Days,Age,mean) #
tapply(Days,list(Sex,Age),mean) #
detach(quine) #attach的逆运行
实践十九(如何写函数)
ss=function(n=100){
z=2;
for(i in 2:n)
if(any(i%%2:(i-1)==0)==F)
z=c(z,i);
return(z)
}#求n以内的素数
fix(ss) #用来修改任何函数或者编写一个新函数
ss() #计算100以内的素数
t1=Sys.time() #纪录系统时间点
ss(10000) #计算10000以内的素数
Sys.time()-t1 #费了多少时间
system.time(ss(10000)) #计算执行ss(10000)所用时间
#函数可以不写return,这时最后一个值为return的值
#为了输出多个值最好使用list输出
实践二十(画图)
x=seq(-3,3,len=20); y=dnorm(x)#产生数据
w=data.frame(x,y) #合并x和y,生成w
par(mfcol=c(2,2)) #准备画4个图的地方
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命令后面追加点(如要追加线可用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))#加符号号码
这些关于符号形状,大小,颜色,以及其它画图选项的说明可用 “?par”查看