S快速入门.docx
- 文档编号:29380446
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:110
- 大小:183.43KB
S快速入门.docx
《S快速入门.docx》由会员分享,可在线阅读,更多相关《S快速入门.docx(110页珍藏版)》请在冰豆网上搜索。
S快速入门
S快速入门
背景介绍
S语言是由AT&T贝尔实验室开发的一种用来进行数据探索、统计分析、作图的解释型语言。
它的丰富的数据类型(向量、数组、列表、对象等)特别有利于实现新的统计算法,其交互式运行方式及强大的图形及交互图形功能使得我们可以方便的探索数据。
目前S语言的实现版本主要是S-PLUS。
它基于S语言,并由MathSoft公司的统计科学部进一步完善。
作为统计学家及一般研究人员的通用方法工具箱,S-PLUS强调演示图形、探索性数据分析、统计方法、开发新统计工具的计算方法,以及可扩展性。
S-PLUS可以直接用来进行标准的统计分析得到所需结果,但是它的主要的特点是它可以交互地从各个方面去发现数据中的信息,并可以很容易地实现一个新的统计方法。
S-PLUS有微机版本和工作站版本,它是一个商业软件。
Auckland大学的RobertGentleman和RossIhaka及其他志愿人员开发了一个R系统,其语法形式与S语言基本相同,但实现不同,两种语言的程序有一定的兼容性。
R是一个GPL自由软件,现在的版本是1.00版,它比S-PLUS还少许多功能,但已经具有了很强的实用性。
我们在这里尽量介绍S-PLUS和R都能使用的功能,且以R为主。
下面我们用S统称S-PLUS和R。
入门实例
S的基本界面是一个交互式命令窗口,命令提示符是一个大于号,命令的结果马上显示在命令下面。
S命令主要有两种形式:
表达式或赋值运算(用<-表示)。
在命令提示符后键入一个表达式表示计算此表达式并显示结果。
赋值运算把赋值号右边的值计算出来赋给左边的变量。
可以用向上光标键来找回以前运行的命令再次运行或修改后再运行。
S是区分大小写的,所以x和X是不同的名字。
我们用一些例子来看S-PLUS的特点。
假设我们已经进入了S-PLUS(或R)的交互式窗口。
如果没有打开的图形窗口,在R中,用:
>x11()
在S-PLUSWindows版中用:
>win.graph()
可以打开一个作图窗口。
然后,输入以下语句:
>x1<-0:
100
>x2<-x1*2*pi/100
>y<-sin(x2)
>plot(x,y,type='l')
这些语句可以绘制正弦曲线图。
其中,“<-”是赋值运算符。
0:
100表示一个从0到100的等差数列向量。
从第二个语句可以看出,我们可以对向量直接进行四则运算,计算得到的x2是向量x1的所有元素乘以常数2*pi/100的结果。
从第三个语句可以看到函数可以以向量为输入,并可以输出一个向量,结果向量y的每一个分量是自变量x2的每一个分量的正弦函数值。
从最后一个语句可以看出函数的调用也很自由,可以按位置给出自变量,也可以用“自变量名=”的形式指定自变量值,这样可以使用缺省值。
下面我们看一看S的统计功能。
>marks<-c(10,6,4,7,8)
>mean(marks)
[1]7
>sd(marks)
[1]2.236068
>median(marks)
[1]7
>min(marks)
[1]4
>max(marks)
[1]10
>boxplot(marks)
>
第一个语句输入若干数据到一个向量,函数c()用来把数据组合为一个向量。
后面用了几个函数来计算数据的均值、标准差、中位数、最小值、最大值。
最后的函数绘制数据的盒形图。
例中sd()是R中才有的函数,在S-PLUS中要用sqrt(var())来计算。
在S命令方式中要显示一个表达式的值只要键入它。
为了演示S的回归计算,我们把SAS中的例子数据SASUSER.CLASS输出到了一个文本文件CLASS.TXT,SAS程序如下:
data_null_;
setsasuser.class;
file'class.txt';
putnamesexageheightweight;
run;
我们在R中把这个文件读入为为一个数据框(dataframe,相当于SAS中的数据集),并进行回归,绘制数据散点图和回归直线。
假设图形窗口已经打开,程序及结果如下:
>cl<-read.table("c:
/work/class.txt",
+col.names=c("Name","Sex","Age","Height","Weight"))
>cl
NameSexAgeHeightWeight
1AliceF1356.584.0
2BeckaF1365.398.0
3GailF1464.390.0
4KarenF1256.377.0
5KathyF1259.884.5
6MaryF1566.5112.0
7SandyF1151.350.5
8SharonF1562.5112.5
9TammyF1462.8102.5
10AlfredM1469.0112.5
11DukeM1463.5102.5
12GuidoM1567.0133.0
13JamesM1257.383.0
14JeffreyM1362.584.0
15JohnM1259.099.5
16PhilipM1672.0150.0
17RobertM1264.8128.0
18ThomasM1157.585.0
19WilliamM1566.5112.0
>attach(cl)
>plot(Height,Weight)
>fit1<-lm(Weight~Height)
>fit1
Call:
lm(formula=Weight~Height)
Coefficients:
(Intercept)Height
-143.026923.89903
>abline(fit1)
>
结果可以产生图1。
我们从这个例子可以看到,分析由函数完成,结果也是对象,可以作为进一步分析的输入。
S-PLUS也提供了一般的计算功能。
比如,求一个矩阵的逆:
>A<-matrix(c(1,2,7,3),ncol=2,byrow=T)
>A
[,1][,2]
[1,]12
[2,]73
>Ai<-solve(A)
>Ai
[,1][,2]
[1,]-0.27272730.18181818
[2,]0.6363636-0.09090909
还可以进行矩阵运算,如:
>b<-c(2,3)
>x<-Ai%*%b
>x
[,1]
[1,]-2.220446e-016
[2,]1.000000e+000
>
这实际上是解了一个线性方程组。
“%*%”表示矩阵乘法。
可以把若干行命令保存在一个文本文件(比如C:
\WORK\MYPROG.S)中,然后用source函数来运行整个文件:
>source("C:
\\WORK\\MYPROG.S")
注意字符串中的反斜杠要写成两个。
用sink()函数可以把以后的输出从屏幕窗口转向到一个外部文本文件,例如:
>sink("C:
\\WORK\\MYPROG.OUT")
要恢复输出到屏幕窗口,使用:
>sink()
在S中可以用“?
”号后面跟要查询的函数来显示帮助信息,例如
>?
c
>?
"=="
(查询特殊符号要用撇号括起来)。
另外,在MSWindows版的S-PLUS中可以用Windows帮助来得到帮助,而在R中可以用HTML浏览器来查询帮助(用“help.start()函数或Help|Rlanguage(html)”启动)。
用好S语言重要的一点就是要用熟系统的帮助功能,因为S的教材或手册都不能列出所有的细节,如果列出所有细节则过于繁琐了。
要退出S-PLUS或R,可以用q()函数,也可以用菜单命令。
R在退出时提问是否保存当前工作空间,它可以把当前定义的所有对象(有名字的向量、矩阵、列表、函数等)保存到一个文件。
S-PLUS自动把对象保存到一个子目录,子目录中每一个文件保存一个对象。
S向量
S语言是基于对象的语言,不过它的最基本的数据还是一些类型,如向量、矩阵、列表(list)等。
更复杂的数据用对象表示,比如,数据框对象,时间序列对象,模型对象,图形对象,等等。
S语言表达式可以使用常量和变量。
变量名的规则是:
由字母、数字、句点组成,第一个字符必须是字母,长度没有限制。
大小写是不同的。
特别要注意句点可以作为名字的合法部分,而在其它面向对象语言中句点经常用来分隔对象与成员名。
另外,下划线不能用在名字中,因为它是赋值符号“<-”的缩写。
常量
常量可以笼统地分为逻辑型、数值型和字符型三种,实际上数值型数据又可以分为整型、单精度、双精度等,非特殊需要不必太关心其具体类型。
例如,123,123.45,1.2345e30是数值型常量,"Weight","李明"是字符型(用两个双撇号或两个单撇号包围)。
逻辑真值写为T或TRUE(注意区分大小写,写t或true都没意义),逻辑假值写为F或FALSE。
复数常量就用3.5-2.1i这样的写法表示。
S中的数据可以取缺失值,用符号NA代表缺失值。
函数is.na(x)返回x是否缺失值(真还是假)。
向量(Vector)与赋值
向量是具有相同基本类型的元素序列,大体相当于其他语言中的一维数组。
实际上在S中标量也被看作是长度为1的向量。
定义向量的最常用办法是使用函数c(),它把若干个数值或字符串组合为一个向量,比如:
>marks<-c(10,6,4,7,8)
>x<-c(1:
3,10:
13)
>x
[1]12310111213
>x1<-c(1,2)
>x2<-c(3,4)
>x<-c(x1,x2)
>x
[1]1234
在显示向量值时我们注意到左边总出现一个“[1]”,这是代表该显示行的第一个数的下标,例如:
>1234501:
1234520
[1]1234501123450212345031234504123450512345061234507123450812345091234510
[11]1234511123451212345131234514123451512345161234517123451812345191234520
第二行输出从第11个数开始,所以在行左边显示“[11]”。
S中用符号“<-”(这是小于号紧接一个减号)来为变量赋值。
另一种赋值的办法是用assign函数,比如
>x1<-c(1,2)
和
>assign("x1",c(1,2))
效果相同。
函数length(x)可以计算向量x的长度。
向量运算
可以对向量进行加(+)减(-)乘(*)除(/)、乘方(^)运算,其含意是对向量的每一个元素进行运算。
;例如:
>x<-c(1,4,6.25)
>y<-x*2+1
>y
[1]3.09.013.5
另外,%/%表示整数除法(比如5%/%3为1),%%表示求余数(如5%%3为2)。
也可以用向量作为函数自变量,sqrt、log、exp、sin、cos、tan等函数都可以用向量作自变量,结果是对向量的每一个元素取相应的函数值,如:
>sqrt(x)
[1]1.02.02.5
函数min和max分别取自变量向量的最小值和最大值,函数sum计算自变量向量的元素和,函数mean计算均值,函数var计算样本方差,函数sd计算标准差(在Splus中用sqrt(var())计算),函数range返回包含两个值的向量,第一个值是最小值,第二个值是最大值。
例如:
>max(x)
[1]6.25
如果求var(x)而x是
矩阵,则结果为样本协方差阵。
sort(x)返回x的元素从小到大排序的结果向量。
order(x)返回使得x从小到大排列的元素下标向量(x[order(x)]等效于order(x))。
任何数与缺失值的运算结果仍为缺失值。
例如,
>2*c(1,NA,2)
[1]2NA4
>sum(c(1,NA,2))
[1]NA
产生有规律的数列
在S中很容易产生一个等差数列。
例如,1:
n产生从1到n的整数列,-2:
3产生从-2到3的整数列,5:
2产生反向的数列:
>n<-5
>1:
n
[1]12345
>-2:
3
[1]-2-10123
>5:
2
[1]5432
要注意1:
n-1不是代表1到n-1而是向量1:
n减去1,这是一个常犯的错误:
>1:
n-1
[1]01234
>1:
(n-1)
[1]1234
seq函数是更一般的等差数列函数。
如果只指定一个自变量n>0,则seq(n)相当于1:
n。
指定两个自变量时,第一自变量是开始值,第二自变量是结束值,如seq(-2,3)是从-2到3。
S函数调用的一个很好的特点是它可以使用不同个数的自变量,函数可以对不同类型的自变量给出不同结果,自变量可以用“自变量名=自变量值”的形式指定。
例如,seq(-2,3)可以写成seq(from=-2,to=3)。
可以用一个by参数指定等差数列的增加值,例如:
>seq(0,2,0.7)
[1]0.00.71.4
也可以写成seq(from=0,to=2,by=0.7)。
有参数名的参数的次序任意,如:
>seq(0,by=0.7,to=2)
[1]0.00.71.4
可以用length参数指定数列长度,如seq(from=10,length=5)产生10到14。
seq函数还可以用一种seq(along=向量名)的格式,这时只能用这一个参数,产生该向量的下标序列,如:
>x
[1]1.004.006.25
>seq(along=x)
[1]123
另一个类似的函数是rep,它可以重复第一个自变量若干次,例如:
>rep(x,3)
[1]1.004.006.251.004.006.251.004.006.25
第一个参数名为x,第二个参数名为times(重复次数)。
逻辑向量
向量可以取逻辑值,如:
>l<-c(T,T,F)
>l
[1]TRUETRUEFALSE
当然,逻辑向量是一个比较的结果,如:
>x
[1]1.004.006.25
>l<-x>3
>l
[1]FALSETRUETRUE
一个向量与常量比较大小,结果还是一个向量,元素为每一对比较的结果逻辑值。
两个向量也可以比较,如:
>log(10*x)
[1]2.3025853.6888794.135167
>log(10*x)>x
[1]TRUEFALSEFALSE
比较运算符包括<,<=,>,>=,==(相等),!
=(不等)。
两个逻辑向量可以进行与(&)、或(|)运算,结果是对应元素运算的结果。
对逻辑向量x计算!
x表示取每个元素的非。
例如:
>(x>1.5)&log(10*x)>1.5
[1]FALSEFALSETRUE
判断一个逻辑向量是否都为真值的函数是all,如:
>all(log(10*x)>x)
[1]FALSE
判断是否其中有真值的函数是any,如:
>any(log(10*x)>x)
[1]TRUE
函数is.na(x)用来判断x的每一个元素是否缺失。
如
>is.na(c(1,NA,3))
[1]FALSETRUEFALSE
逻辑值可以强制转换为整数值,TRUE变成1,FALSE变成0。
例如,我们以age>65为老年人,否则为年轻人,可以用c("young","old")[(age>65)+1]这样的表示。
当年龄大于65时age>65等于TRUE,加1则把TRUE转换为数值型的1,结果得2,于是返回第二个下标处的“old”。
否则等于0+1下标处的“young”。
字符型向量
向量元素可以取字符串值。
例如:
>c1<-c("x","sin(x)")
>c1
[1]"x""sin(x)"
>ns<-c("Weight","Height","年龄")
>ns
[1]"Weight""Height""年龄"
paste函数用来把它的自变量连成一个字符串,中间用空格分开,例如:
>paste("My","Job")
[1]"MyJob"
连接的自变量可以是向量,这时各对应元素连接起来,长度不相同时较短的向量被重复使用。
自变量可以是数值向量,连接时自动转换成适当的字符串表示,例如:
>paste(c("X","Y"),"=",1:
4)
[1]"X=1""Y=2""X=3""Y=4"
分隔用的字符可以用sep参数指定,例如下例产生若干个文件名:
>paste("result.",1:
6,sep="")
[1]"result.1""result.2""result.3""result.4""result.5""result.6"
如果给paste()函数指定了collapse参数,则paste()可以把一个字符串向量的各个元素连接成一个字符串,中间用collapse指定的值分隔。
比如paste(c('a','b'),collapse='.')得到'a.b'。
复数向量
S支持复数运算。
复数常量只要用3.5+2.1i这样的格式即可。
复向量的每一个元素都是复数。
可以用complex()函数生成复向量(见帮助)。
Re()计算实部,Im()计算虚部,Mod()计算复数模,Arg()计算复数幅角。
向量下标运算
S提供了十分灵活的访问向量元素和向量子集的功能。
某一个元素只要用x[i]的格式访问,其中x是一个向量名,或一个取向量值的表达式,如:
>x
[1]1.004.006.25
>x[2]
[1]4
>(c(1,3,5)+5)[2]
[1]8
可以单独改变一个元素的值,例如:
>x[2]<-125
>x
[1]1.00125.006.25
事实上,S提供了四种方法来访问向量的一部分,格式为x[v],x为向量或向量值的表达式,v是如下的表示下标向量:
一、取正整数值的下标向量
v为一个向量,取值在1到length(x)之间,取值允许重复,例如,
>x[c(1,3)]
[1]1.006.25
>x[1:
2]
[1]1125
>x[c(1,3,2,1)]
[1]1.006.25125.001.00
>c("a","b","c")[rep(c(2,1,3),3)]
[1]"b""a""c""b""a""c""b""a""c"
二、取负整数值的下标向量
v为一个向量,取值在-length(x)到-1之间,表示扣除相应位置的元素。
例如:
>x[-(1:
2)]
[1]6.25
三、取逻辑值的下标向量
v为和x等长的逻辑向量,x[v]表示取出所有v为真值的元素,如:
>x
[1]1.00125.006.25
>x<10
[1]TRUEFALSETRUE
>x[x<10]
[1]1.006.25
>x[x<0]
numeric(0)
可见x[x<10]取出所有小于10的元素组成的子集。
这种逻辑值下标是一种强有力的检索工具,例如x[sin(x)>0]可以取出x中所有正弦函数值为正的元素组成的向量。
如果下标都是假值则结果是一个零长度的向量,显示为numeric(0)。
四、取字符型值的下标向量
在定义向量时可以给元素加上名字,例如:
>ages<-c(Li=33,Zhang=29,Liu=18)
>ages
LiZhangLiu
332918
这样定义的向量可以用通常的办法访问,另外还可以用元素名字来访问元素或元素子集,例如:
>ages["Zhang"]
Zhang
29
>ages[c("Li","Liu")]
LiLiu
3318
向量元素名可以后加,例如:
>ages1<-c(33,29,18)
>names(ages1)<-c("Li","Zhang","Liu")
>ages1
LiZhangLiu
332918
上面我们看到了如何访问向量的部分元素。
在S中还可以改变一部分元素的值,例如:
>x
[1]1.00125.006.25
>x[c(1,3)]<-c(144,169)
>x
[1]144125169
注意赋值的长度必须相同,例外是可以把部分元素赋为一个统一值:
>x[c(1,3)]<-0
>x
[1]01250
要把向量所有元素赋为一个相同的值而又不想改变其长度,可以用x[]的写法:
>x[]<-0
注意这与“x<-0”是不同的,前者赋值后向量长度不变,后者使向量变为标量0。
改变部分元素值的技术与逻辑值下标方法结合可以定义向量的分段函数,例如,要定义y=f(x)为当x<0时取1-x,否则取1+x,可以用:
>y<-numeric(length(x))
>y[x<0]<-1-x[x<0]
>y[x>=0]<-1+x[x>0]
多维数组和矩阵
数组(array)和矩阵(matrix)
数组(array)可以看成是带多个下标的类型相同的元素的集合,常用的是数值型的数组如矩阵,也可以有其它类型(如字符型、逻辑型、复型数组)。
S可以很容易地生成和处理数组,特别是矩阵(二维数组)。
数组有一个特征属性叫做维数向量(dim属性),维数向量是一个元素取正整数值的向量,其长度是数组的维数,比如维数向量有两个元素时数组为二维数组(矩阵)。
维数向量的每一个元素指定了该下标的上界,下标的下界总为1。
一组值只有定义了维数向量(dim属性)后才能被看作是数组。
比如:
>z<-1:
1500
>dim(z)<-c(3,5,100)
这时z已经成为了一个维数向量为c(3,5,100)的三维数组。
也可以把向量定义为一维数组,例如:
>dim(z)<-1500
数组元素的排列次序缺省情况下是采用FORTRAN的数组元素次序(按列次序),即第一下标变化最快,最后下标变化最慢,对于矩阵(二维数组)则是按列存放。
例如,假设数组a的元素为1:
24,维数向量为c(2,3,4),则各元素次序为a[1,1,1],a[2,1,1],a[1,2,1],a[2,2,1],a[1,3,1],...,a[2,3,4]。
用函数array()或matrix()可以更直观地定义数组。
array()函数的完全使用为array(x,dim=length(x),dimnames=NULL),其中x是第一自变量,应该是一个向量,表示数组的元素值组成的向量。
dim参数可省,省
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 快速 入门