您的当前位置:首页R语言初步

R语言初步

2024-07-28 来源:飒榕旅游知识分享网


R语言初步1

第一节 基本知识

一、界面介绍

R语言是一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R语言最早由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发,所以命名为R语言。

R语言是免费下载的,可以在网站Http:\\\\cran.r-project.org/中找到适合自己的镜像网站,下载R语言安装包和其他文件。

R的界面大致如下图所示,包括菜单、快捷键、命令窗口和图形输出窗口。

R主要通过在命令窗口中输入命令来进行操作,菜单能够提供的功能很少,因此学习R需要记住一些常用的命令,更多的命令则需要常备一份命令手册,以便查询。

1

参考薛毅,陈立萍(2014):R语言实用教程,清华大学出版社

1

R的命令窗口中有一个红色的“>”符号,操作命令即写在这个符号的后面,完成一条命令后,用回车结束。

用getwd()可以知道R的工作路径,也就是操作过程中的数据、文件等所存储的目录。一般默认的目录为用户的Document目录。为了避免大量的文件混淆,可以专门为R的操作设定一个工作目录。

假定在C盘上建立一个名叫“R”的目录,用以下命令进行设定:setwd(\"c:\\\\R\"),如图:

在这里注意一下,当引用一个路径时,R中需要用到双斜线来表示路径引用,如上文中的c:\\\\R,这是R的一个特殊情况。

再比如以下操作:

>x1<-c(10,12,14,16,18)

>y1<-c(2.5,2.6,3.1,4.6,3.8)

>plot(x1,y1)

2

注意几点:

(1)式子中的“<-”表示赋值,也就是把右边的数值赋予左边的变量名。

(2)R语言中对于字母的大小写非常敏感,变量名可以用大写也可以用小写,但用大写字母命名的变量如果改用小写来调用,会无法识别。

(3)如果觉得命令窗口上的内容太多,可以用Ctrl-L来清屏幕。

(4)如果要重新调用此前用过的命令,可以用上箭头回溯此前的命令,也可以用history()来查看历史记录。

(5)命令窗口中的命令行如果太长需要分行,回车后前面会出现一个红色的+号,可以在这后面继续写命令。但如果是在脚本程序中分行,则不需要写这个+号。

二、R的工作空间

启动R之后,即开启了一个特定的工作空间。在这个工作空间中创建的变量会保存下来,在后续的操作中可以反复使用。因此,在使用R时,需要知道自己在工作空间中创建

3

了哪些变量,这些变量分别代表了哪些含义。

比如在上一小节的例子中,我们建立了两个向量x1和y1,那么这两个向量会一直存在于工作空间中。在命令行中直接输入向量名,可以显示出其内容。

> x1

[1] 10 12 14 16 18

如果想知道工作空间中有哪些变量存在,可以用ls()函数。如下图2

用rm(x1)可以删除变量x1。用下列命令可以删除所有的变量:

> rm(list=ls(all=TRUE))3

退出R使用q()命令,这时系统会询问是否保存工作空间,可以在对话框中选择“是”或者“否”。也可以在q()命令中进行设定,如:

>q(save=\"yes\")

这里显示出这么多变量的原因是此前做过一个演示操作,遗留下许多过程变量。如果想知道某个变量的内容,可以直接输入这个变量的名称,再回车。

3 请自己分析一下这条命令的结构,借以了解R语言的特色

4

2

如果保存了工作空间,则在指定的工作目录下会出现一个工作空间文件。下一次启动R的时候,可以直接双击这个工作空间文件,这样在启动R的同时,也会载入相应的工作空间,继续此前的工作。

用load(\"C:\\\\R\\\\.RData\")也可以实现同样的功能。

三、加载程序包

R软件安装后,仅包括了基本程序包,能够实现一些常规的统计分析。如果要做一些特殊的分析,则需要加载新的程序包。

比如说,线性判别分析需要用到的lda()函数来自于程序包MASS,用下列方式加载:

>library(\"MASS\")

有些程序包来自于其他的软件库,需要选择软件库,然后再选择“安装程序包”,这个可以通过界面上的“程序包”菜单里的选项来完成。在此前,需要先设定CRAN镜像,可以在连网的前提下选择一个中国的镜像站点。

在联网的条件下,通过help(\"XXXX\")命令可以帮助信息,如果不清楚某个命令的参数该如何设定等等,可以边看帮助文件边操作。

第二节 数据管理

5

一、变量

1. 变量类型

R中的变量包括:

数值型(numeric),其中又包括整型、单精度型、双精度型三类;

逻辑型(logical),取值只能是TRUE或者FLASE,也可以简写为T或者F;

字符型(character),是夹在单引号或者双引号中间的字符串;

复数型(complex),用a+bi的形式来显示;

> sqrt(-1+0i)

[1] 0+1i

原始型(raw),是指用二进制方式保存的数据。

2. 变量形式

(1)单一变量:就是存在单一值的变量。

(2)向量:由若干个相同类型的元素构成的序列,是R中最常用的对象,可以用来反映数据分析中的一个变量。

6

>x1<-c(10,12,14,16,18)

在上例中,生成了一个名叫x1的向量,包括5个元素。c()称为连接函数,用于把各个分量合并成一个向量。

看看下面的操作

(3)矩阵

用matrix()函数可以生成一个指定维度的矩阵,如下例所示:> mdata<-matrix(c(1,2,3,11,12,13),

+ nrow=2,ncol=3,byrow=TRUE,

+ dimnames=list(c(\"a1\

> mdata

var1 var2 var3

a1 1 2 3

7

a2 11 12 13

其他矩阵函数:

dim():和于设置或取对象(包括矩阵、数组等)的维数

nrow():矩阵的行数;

ncol():矩阵的列数;

rbind():矩阵按行合并;

cbind():矩阵按列合并;

矩阵元素的引用,用A[1,2]这样的格式。

(4)数组

向量是一维数组,矩阵是二维数组,数组则是更多维的情况。数组的语法是:

array(data=NA, dim=length(data), dimnames=NULL)

(5)因子、列表、对象

因子是用于数据分组的标签,类似于向量的形式,与向量同时使用时可以对向量中的元素进行分组。

8

列表与向量类似,区别在于列表中的元素不需要是同一种类型的数据,也可以认为是一个多维数组中的一条记录。

对象可以指代R中的一切客体,包括数据,也包括结束。例如,做回归分析后的结果可以输出到一个变量,这个变量就成为一个对象,其中包括了分析后得到的所有文字结果和数据结果。

(6)数据框

相当于一个数据库,包括了需要处理的数据。

> df<-data.frame(Name=c(\"张三\李四\王五\赵六\陆仁贾\"), Sex=c(\"F\

Age=c(13,13,12,13,12),

Height=c(56.5,65.3,57.3,62.5,59.0), Weight=c(84.0,98.0,83.0,84.0,99.5) )

> df

3. 产生特定形式的向量

(1)等差数列

9

> (x1<-1:10)

[1] 1 2 3 4 5 6 7 8 9 10

上述命令中的括号表示在生成向量之后即将其显示出来。

注意:“:”的计算优先级高于四则运算。

(2)等间隔函数

函数语法:

seq(from=1, to=1, by=x, length.out=NULL, along.with=NULL)4

其中,by、length.out、along.with三个参数只能输入一个。

by表示数据间的间隔;length.out表示在间隔中生成的数据的个数;along.with后面必须带一个向量,表示将这个向量按照间隔所设定的区间进行等比例缩放。

试试以下的命令

>seq(0,5,length.out=20)

>seq(1,10,by=2)

后面还有很多语法命令,其中使用A=B这种形式的,表示B是默认值。例如配合中from=1,表示在不设定的情况下,from的默认值为1。

10

4

>seq(10)

>seq(1,5,along.with=rnorm(20))

(3)重复函数

rep()

试试下面的命令(分别反映rep()中可选择的各种参数)

>rep(1:4,times=2)

>rep(1:4,length.out=15)

>rep(1:4,each=3)

>rep(1:4,c(1,4,2,4))

(4)产生默认的向量

vector(mode=\"logical\

其中,mode可以选择各种变量类型,默认为逻辑型;length为生成的向量长度。>vector(mode=\"numeric\

11

二、函数

1. 数学函数

abs(x),sqrt(x),exp(x),log(x),log10(x),log(x,n),sin(x),factorial(x),choose(n,k),gamma(x),floor(x),ceiling(x),trunc(x)

2. 字符串函数

nchar(),substr(),paste(),strsplit(),noquote()

3. 向量函数

min(),max(),which.min(),which.max(),range(),sum(),prod(),length(),median(),mean(),var(),sd(),sort(),order(),sort.list()

三、读写数据

1. 读入表格形式的纯文本文件

read.table()

可以带上各种参数,包括数据的表头等等,在没有设定表头的情况下,默认的变量名为V1、V2等形式。

读入的数据框架可以用edit()函数来进行编辑,也可以直接用edit()函数来生成一个数

12

据框架。

2. 读入数据流文件

例如hw.data的形式为:172 75 169 54 169 64 171 65 166 47……

>scan(\"hw.data\

3. 读取其他格式数据

需要安装foreign程序包,则可使用read.spss(),read.xport(),read.S(),read.dta(),分别对应SPSS,SATA,S-plus,Stata等格式的文件。

4. 读取EXCEL数据

(1)将数据转化为“文本文件(制表符分隔)”,用read.delim()

(2)转换为CSV文件,用read.csv()

(3)直接读取,需要安装RODBC程序包,然后用odbcConnectExcel()函数完成连接,再用sqlTable()建立起查询关系。

5. 数据集的读取

数据集是R软件包中可利用的数据集。用data()可以列出Base程序包中的可用数据集,如果要加载,只需要在括号中加入数据集的名称,如data(infert),可载入对应的数据

13

集。

如果要加载其他软件包中的数据集,可以用

>data(package=\"cluster\")

6. 写数据文件

(1)写为数据流文件

write(x, file=\"data\

ncolumns表示每行写几列,字符型变量默认为1列,数值型默认为5列。

(2)写为表格文件

write.table()

write.csv()

第三节 常规统计分析

一、统计分布

1. 与分布相关的函数

14

(1)正态分布

dnorm(x,mean=0,sd=1,log=FALSE):概率密度函数;

pnorm(q,mean=0,sd=1,lower.tail=TRUE,log.p=FALSE):分布函数;

qnorm(p,mean=0,sd=1,lower.tail=TRUE,log.p=FALSE):分位函数;

上述函数可以用于进行正态分布的各种计算。

(2)均匀分布:dunif(),punif(),qunif()

(3)指数分布:dexp()

(4)二项分布:dbinom()

(5)Poisson分布:dpois()

(6)卡方分布:dchisq()

(7)t分布:dt()

(8)F分布:df()

2. 随机数的生成

15

要生成服从各种分布的随机数,可以在上述分布名称的前面加上r。

例如,要生成服从正态分布的随机数,可以这样做:

x<-rnorm(100,0,1)

如果要生成均匀分布的随机数,用下列命令

runif(n, min=0, max=1)

3. 随机抽样

sample(x,size, replace=TRUE, prob=NULL)

从x中抽出一个容量为size的样本。

二、假设检验

1. t检验

t.test(x,y=NULL, alternative=c(\"two.sided\

mu=0, paired=FALSE, var.equal=FALSE, conf.level=0.95, ...)

例如:

16

> X<-c(159,280,101,212,224,379,179,264,

+ 222,362,168,250,149,260,485,172)

> t.test(X,alternative=\"greater\

One Sample t-test

data: X

t = 0.67423, df = 15, p-value = 0.2552

alternative hypothesis: true mean is greater than 225

95 percent confidence interval:

198.3989 Inf

sample estimates:

mean of x

241.625

2. F检验

17

var.test(x,y, ratio=1, alternative=c(\"two.sided\

conf.level=0.95, ...)

3. 二项分布检验

prop.test(x,n, p=NULL, alternative= c(\"two.sided\

conf.level=0.95, correct=TRUE)

三、非参数统计

1. 列联表分析

列联表分析使用卡方检验函数进行,需要事先把数据转化为矩阵形式,如下例:> x<-c(20,24,80,82, 22,38,104,125,

+ 12,28,81,113, 7,18,54,92)

> X<-matrix(x, nc=4, byrow=TRUE)

> chisq.test(X)

Pearson's Chi-squared test

18

data: X

X-squared = 12.507, df = 9, p-value = 0.1862

因为P值大于0.05,所以不能拒绝原假设,即可以认为行与列之间不存在相关性。

2. 相关性分析

cor.test(x,y, alternative= c(\"two.sided\

method=c(\"pearson\

exact=NULL, conf.level=0.95, continuity=FALSE, ...)

可以看到,这一条命令可以分别执行Pearson相关、Kendall相关和Spearman等级相关等检验。

3. 游程检验

游程检验需要单独安排程序包(tseries),安装完成后,用命令

runs.test(x, alternative= c(\"two.sided\

4. 其他非参数检验

(1) Wilcoxon符号秩检验

19

wilcox.test(x,y=NULL, alternative= c(\"two.sided\

mu=0, paired=FALSE, exact=NULL, correct=TRUE,

conf.int=FALSE, conf.level=0.95, ...)

(2)Friedman检验

friedman.test(y, groups, blocks, ...)

(3)Kruskal-wallis秩和检验

kruskal.test(x,g, ...)

更多的非参数检验方法可自行搜索。

四、回归分析

1. 线性回归函数

lm(formula, data, subset, weights, na.action, method=\"qr\

model=TRUE, x=FALSE, y=FALSE, qr=TRUE,

singular.ok=TRUE, contrasts=NULL, offset, ...)

20

其中:

formula为模型公式,用形如y~1+x1+x2这样的形式;

data为数据框,subset为样本子集,是可选项;

weights为可选项,是一个向量,用于表示对应样本的权重;

na.action为函数,表示当数据中出现缺失时的处理方法;

method为模型的计算方法;

model等参数主要体现输出结果的显现内容。

lm()函数通常与summary()函数共同使用,先把lm()的结果输出给一个对象变量,然后用summary()函数把这个变量显示出来。

2. 残差分析与影响分析

残差分析:resid(object)

影响分析:influence.measures(object)

其中,object是在回归分析中所生成的对象,用一个名称表示,例如可以用

lm.sol<-lm(...)

21

来形成一个回归对象,在后续的分析中将使用这个对象lm.sol来作为回归结果的调用。对象名称可以再圆点,也可以使用其他形式的名称。

观察下列的影响分析结果:

influence.measures(lm.sol)

par(mfrow=c(2,3),mar=0.4+c(4,4,1,1),oma=c(0,0,2,0)

plot(lm.sol,1:6)

3. 岭回归

岭回归需要加载MASS程序包,格式如下:

lm.ridge(formula, data, subset, na.action, lambda=0, model=FALSE,

22

x=FALSE, y=FALSE, contrasts=NULL, ...)

4. 多项式回归

高次方使用I()函数在formula公式中进行指代,交叉项用x1:x2的形式表示,如

lm(y~1+x1+I(x1^2)+I(x1^3)+x1:x2+x2)

5. 非线性回归

使用nls()函数,格式与lm()相同,使用通用的公式表达法表现formula,如

nls(y~a+(0.49-a)*exp(-b*(x-8), data=cl, start=list(a=0.1,b=0.1),model=T)

6. 广义线性回归

基本公式

glm(formula, family=gaussian, data, weights, subset, na.action,

start=NULL, etastart, mustart, offset, control=list(..), model=TRUE,

method=\"glm.fit\

其中,family为误差函数的分布族,通过设定分布族和对应的link函数可以完成不同类型的回归。family中对应的分布族包括:binomial,gaussian,Gamma,

23

inverse.gaussian,poisson,quasi。

例如:

x<-0:5

y<-c(0,9,21,47,60,63)

Y<-cbind(y,70-y)

glm.sol<-glm(Y~x, family=binomial(link=logit))

summary(glm.sol)

输出结果为:

Call:

glm(formula = Y ~ x, family = binomial(link = logit))

Deviance Residuals:

1 2 3 4 5 6

-2.2507 0.3892 -0.1466 1.1080 0.3234 -1.6679

24

Coefficients:

Estimate Std. Error z value Pr(>|z|)

(Intercept) -3.3010 0.3238 -10.20 <2e-16 ***

x 1.2459 0.1119 11.13 <2e-16 ***

---

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1(Dispersion parameter for binomial family taken to be 1)

Null deviance: 250.4866 on 5 degrees of freedom

Residual deviance: 9.3526 on 4 degrees of freedom

AIC: 34.093

Number of Fisher Scoring iterations: 4

第四节 多元分析

一、结构方程模型

25

结构方程模型需要使用程序包plspm,使用程序包中自带的数据包satisfaction.csv)。

程序如下:

library(plspm)

data(satisfaction)

IMAG<-c(0.0,0,0,0,0)

EXPE<-c(1,0,0,0,0,0)

QUAL<-c(0,1,0,0,0,0)

VAL<-c(0,1,1,0,0,0)

SAT<-c(1,1,1,1,0,0)

LOY<-c(1,0,0,0,1,0)

sat.mat<-rbind(IMAG,EXPE,QUAL,VAL,SAT,LOY)

sat.sets<-list(1:5,6:10,11:15,16:19,20:23,24:27)

sat.mod<-rep(\"A\

26

res=plspm(satisfaction,sat.mat,sat.sets,sat.mod,scaled=F)

summary(res)

par(mfrow=c(1,1))

plot(res,what=\"all\")

二、判别分析

线性判别函数与二次判别函数

lda(formula, data, ... , subset, na.action)

qda(formula, data, ... , subset, na.action)

三、聚类分析

(1)距离函数

27

dist(x, method=\"euclidean\

method的参数可以选择euclidean,maximum,manhattan,canberra,binary,minkowski。

(2)数据变换

scale(x, center=TRUE, scale=TRUE)

(3)系统聚类法

hclust(d, method=\"complete\

其中,d为利用距离函数计算出来的距离矩阵,method方法包括single,complete,median,mcquitty,average,centroid,ward。

将计算后的结果用于plot函数,可以画出谱系图。

画谱系图的另一个工具是plclust()函数。

四、主成分分析

可以用下列两种形式的函数来完成:

princomp(formula, data=NULL, subset, na.action, ...)

28

princomp(x, cor=FALSE, scores=TRUE, covmat=NULL,

subset=rep(TRUE, nrow(as.matrix(x))), ...)

结果用于screeplot()函数,可以画出碎石图。

五、因子分析

用以下命令完成因子分析,并将结果载入一个对象

factanal(x, factors, data=NULL, covmat=NULL, n.obs=NA, subset, na.action,

start=NULL, scores=c(\"none\

rotation=\"varimax\

因子载荷阵的正交旋转:varimax()

斜交旋转:promax()

六、典型相关分析

cancor(x,y, xcenter=TRUE, ycenter=TRUE)

第五节 绘图

29

绘图命令可以通过demo(graphics)、demo(image)、demo(persp)进行演示,通过分析演示命令,逐渐掌握绘图技巧。

一、高水平绘图函数

高水平绘图函数指能够自动生成各种新图形的函数,包括坐标轴、坐标刻度、标题等等。

1. plot函数

plot(x, y, type=\"p\

ann=par(\"ann\"),

axes=TRUE, frame.plot=axes, panel.first=\"\

2. 其他

多组图:pairs()

协同图:coplot()

点图:dotchart()

饼图:pie()

条形图:parplot()

30

直方图:hist()

箱线图:boxplot()

QQ图:qqnorm()

三维透视图:persp()

二、图形参数

1. 使用于绘图命令中的图形参数

add=TRUE:表示新绘制的图形与旧的图形叠加;axes=TRUE:表示图形中添加坐标轴;

log=\"x\":对x轴的数据取对数;

xlim=c(x1,x2):描述图形中x轴的取值范围;

main=\"XX\":设置图形的标题;

sub=\"XX\":设置图形的副标题;

xlab=\"XX\":设置x轴的标题。

31

2. 图形参数的永久设置

用函数par()可以对图形参数进行永久设置。直接使用不带参数的par(),可以显示出图形参数的默认值。为了保证在修改图形参数之后可以再恢复到初始值,可以使用以下的操作:

>xx<-par()

>par(...) #表示对图形参数进行修改

>par(xx) #表示恢复原有的图形参数

可设置的参数包括:

(1)点的形状:pch=k,k是0-25中的某个数字,表示25种不同的字符。k也可以用特定字符表示,表示一些特殊的形状。

(2)线的类型:lty=k,k为1-12的某个数字;

(3)线的宽度:lwd=k,影响到lines()函数以及坐标轴的宽度,取值可以为小数;

(4)点、线、文本、区域的颜色:col=k, bg=k

用col.axis、col.lab、col.main、col.sub等可以规定特定元素的颜色。

颜色k的取值可以是数字,也可以是字符串,如\"yellow\"、\"springgreen2\"之类。用

32

colors()函数可以查看颜色和代码的对应关系。

(5)字体类型:font=k,k为1-4,分别代表正体、黑体、斜体、黑斜体。

(6)文本对齐方式:adj=k,k表示的文本对齐的比例。0表示左对齐、1表示右对齐,0.5表示居中。k也可以取其他值,例如-0.1,表示文本出现在给定坐标位置的右边,空出相当于文本10%长度的距离。

(7)字符的放大倍数:cex=k

(8)坐标轴与刻度

坐标轴刻度线的数量:lab=c(5,7,12),三个参数分别对应x轴刻度线的数量、y轴刻度线数量以及坐标轴刻度标签的宽度为多少字符。

坐标轴刻度标准的方向:las=k,其中0表示平行与坐标轴,1表示水平,2表示垂直于坐标轴。

坐标轴各部件的位置:mgp=c(3,1,0),三个参数分别对应坐标轴位置到坐标轴标签的距离,坐标轴位置到坐标轴刻度标签的距离,坐标轴位置到实际画出的坐标轴的距离。

坐标轴刻度线的长度:tak=0.01,数值为占绘图区域的比例。

坐标轴标签的类型:xaxs=r,yaxs=i,取值为\"r\",\"i\",\"e\",\"s\",\"d\"。

(9)图形边空

33

mai或者mar,前者用英寸表示,后者用文本行高度表示。

例如:

>par(mai=c(1,0.5,0.5,0))

>par(mar=c(4,2,2,1))

(10)多图环境

使用mfrow或者mfcol,如:

>par(mfrow=c(4,4))

> for(i in 1:16) hist(rnorm(500),col=sample(c(1:8),1),main=\"正态分布\")

注意,上述图形如果出现边界重叠的情况,要用mai参数把边界修改到0.3左右的水平。

34

用layout()函数设置多图环境,如下

> layout(matrix(c(1:4,2,2),2,2,byrow=T),widths=c(3,1),heights=c(1,3))

> layout.show(4)

三、低水平绘图函数

1. 添加点、线、文本、符号、数学表达式

points(x,y=NULL, type=\"p\

lines(x, y=NULL, type=\"l\

text(x, y=NULL, labels=seq_along(x), adj=NULL, ...)

如果希望在图形中添加数学符号或者公式,需要使用expression()函数,具体应用可参见demo(plotmath)。

2. 添加直线、线段、图例

35

abline(a=NULL, b=NULL, h=NULL, v=NULL, reg=NULL, coef=NULL, untf=FALSE)

segments(x0, y0, x1=x0, y1=y0, col, lty, lwd)

legend(x, y=NULL, legend, fill=NULL, ...)

3. 添加多边形和图形阴影

polygon(x, y=NULL, density=NULL, angle=45, border=NULL, ...)

36

因篇幅问题不能全部显示,请点此查看更多更全内容