第二章 S-Plus 基础
中国人民大学统计学院
本章要求
熟悉在 S-Plus 命令行中 S-Plus 基本数据处理 熟悉在 S-Plus 命令行中进行基本数据基本运
算 编写简单的计算函数 绘制基本图形
中国人民大学统计学院
第一节 S-Plus 环境 S-Plus 用户界面 算术运算
中国人民大学统计学院
S-Plus
S 语言和 S 的扩展 S-Plus ,是由 AT&T Bell 实验室于 20 世纪 70 年代末 ~80 年代初研制开发的,其中 Rick Becker 和 John Chambers 是主要创始人之一。
中国人民大学统计学院
S-Plus 的主要应用特点:1. S-Plus 拥有强大的面向对象的开发环境。
2. 作为标准的统计语言, S 拥有几乎所有,在 S-Plus 中,用户可以随处自定义的各种函数,延伸基本的分析方法。
3. 作为面向对象的语言, S 集数据的定义、插入、修改和函数计算等功能于一体,
语言风格统一,可以独立完成数据分析生命周期的全部活动。
4. S-Plus 提供了非常丰富的 2D 和 3D 图形库。
5. 与 S-Plus 类似的有新近开发的 R , R 最早由 Auckland 大学统计系的 Robert Gentleman 和 Ross Ihaka 于 1995 年开始研制开发,从 1997 年开始免费公开发布。 R 在计算功能上比 S-Plus 有更高的效率,但由于推出时间较短,因而不如 S-Plus 普及。 S-Plus 和 R 二者在语法和功能实现上区别不大,因而学习 S-Plus 的用户可以轻松转到 R ,反之亦然。
中国人民大学统计学院
S-Plus 界面六项内容:
Object Explorer (对象浏览器); Commands Window (命令窗口) ; Graph Sheets (图形操作表) ; Script Window (草稿窗口); Menus (菜单); Toolbars (工具栏)。
中国人民大学统计学院
第二节 向量的基本操作
一、向量的定义和表示二、向量的基本操作二、向量的算术运算三、向量的逻辑运算
中国人民大学统计学院
一、向量的定义一、算术运算: S-Plus 默认的命令提示符是“ >” 1) 计算 7 X 3 ,可如下执行命令: > 7*3 > 21 2) 计算 (7+2) X 3 ,可如下执行命令: > (7+2)*3 > 42 3) 计算 \log2 ( 12 /3 ),可如下执行命令: > log(12/3,2) > 2 4) 计算幂 2 X 32 ,可如下执行命令: > 2*(3^2) > 18
中国人民大学统计学院
一、 向量的定义
二、赋值: > x<-3 > y_1+x 屏幕打印变量如下, x : > x > 3 > print(x*y) > 12
中国人民大学统计学院
二、向量的基本操作
1 、连接命令 ;2 、序列命令 seq;3 、循环命令 rep;
中国人民大学统计学院
1 、连接命令 例 1 : > A.brand<-c(15,27,89) # 生成数值类型的向量 > A.brand*0.8 [1] 12.0 21.6 71.2 > title.text<-c(“This”,“is”,“for”,“sale”)# 生成非
数值类型的向量1. 向量 a中第 i位置元素表示: > A.brand[1] [1] 15 > A.brand[length(A.brand)] [1] 89 如果输入的位置超出向量的长度,则 S-Plus 输出 NA , NA 表
示数据缺失,如下所示: > A.brand[6] [1] NA
中国人民大学统计学院
1 、连接命令(续)2. 在向量中插入新的数据:
在 A.brand 向量末尾添加两个新产品价格的书写方法是:
例 1 续 :
> add.A.brand<-c(A.brand,189,240)
> add.A.brand
[1]15 27 89 189 240
在向量的开头插入新数据的书写方法如下:
> addbegin.A.brand<-c(12,13,A.brand)
[1] 12 13 15 27 89
思考题 1 : 如何在向量的第i个位置后插入数据?
中国人民大学统计学院
1 、连接命令(续)
3. 向量与向量的合并: B.brand<-c(35,40,58) AB.brand<-c(A.brand,B.brand) [1] 15 27 89 35 46 58 向量中元素的个数,称为向量的长度,查
看向量中元素的个数,可以使用 length 命令,如下所示:
length(add.A.brand) [1] 5
中国人民大学统计学院
1 、连接命令(续)4. 在向量中删除数据: 将 A.brand 向量中起始位置的产品价格删除的方
法用减法表示,如下表示:例 1 续 : > delete.A.brand<-add.A.brand[-1] > delete.A.brand [1] 27 89 189 240 将 A.brand 向量末尾的产品价格删除的方法是: > delete.A.brand<-add.A.brand[-length(add.
A.brand)] > delete.A.brand [1] 15 27 89 189
中国人民大学统计学院
2 、序列命令 seqseq 命令的语法如下所示: seq(lower,upper,[increment],[length],...)例 2: > seq(1,10) [1] 1 2 3 4 5 6 7 8 9 10 > seq(1900,2000,6) [1] 1900 1906 1912 1918 1924 1930 1936 1942 1948
1954 [11] 1960 1966 1972 1978 1984 1990 1996 > seq(1,0,-0.1) [1] 1.0 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0.0 > 1:10 #seq(1,10) > seq(0,1,0.05,length=10)
中国人民大学统计学院
3 、循环命令 reprep 命令的语法结构如下所示: rep(pattern,number of times,length)例 3 > rep(2,6) 2 2 2 2 2 2 > rep(c(0,5),2) 0 5 0 5 > rep(1:3,3) 1 2 3 1 2 3 1 2 3 > rep(c(1,4,6),length=5) 1 4 6 1 4
思考题 3 :
猜测如下程序的输出结果: rep(c(1,2,3), c(1,2,3))
中国人民大学统计学院
三、向量的算术运算向量算术运算是对标量运算的扩展:例 4: > a<-seq(0,20,3) > 2*a 0 6 12 18 24 30 36 > a<-2*(0:2) > b<-1:3
中国人民大学统计学院
四、向量的逻辑运算S-Plus 中有两个逻辑值: TRUE 和 FALSE :
> 3==4 F 常用的逻辑运算符如表 1.3 :
中国人民大学统计学院
向量的逻辑运算例:
例 6: 假设 price 表示某一公司推出的所有产品价目表,将 price 中大于 10 的所有数据找出来:
> price<-c(2,3,10,11,15) > large10<-price[price>10] [1] 11 15
中国人民大学统计学院
第三节 复杂的数据结构
矩阵 数组 数据框架 列表
中国人民大学统计学院
一、矩阵 1. 定义矩阵: 例 7 :假定有国民经济数据 data ,其中显示了 2003 年中国、日本、韩国三个国家的国家生产总值 GDP (单位: 1012 US$ ),年末人口(单位:亿)及通货膨胀率(单位: 100% ):
> macroecno<-c(1.4,12.92,1.2,4.5,0.56,-0.8,10.88,2.91,1.2)
> asia.data<-matrix(macroecno,nrow=3,ncol=3,byrow=T,dimnames)
> asia.data [,1] [,2] [,3] [1,] 1.4 12.92 1.2 [2,] 4.5 0.56 -0.8 [3,] 0.4 0.5 1.7
中国人民大学统计学院
例题例 7 续 : 给数据指定列名和行名:> dimnames(asia.data) NULL > dim(asia.data) 3,3 > row.name<-c("P.R.China","Japan","KOREA") > col.name<-c("GDP","POP","INFLAT") > dimnames(asia.data)<-list(row.name,NULL) > asia.data [,1] [,2] [,3] P.R.China 1.4 12.92 1.2 Japan 4.5 0.56 -0.8 KOREA 0.4 0.5 1.7 > dimnames(asia.data)<-list(NULL,col.name)
中国人民大学统计学院
例题(续) > asia.data GDP POP INFLAT [1] 1.4 12.92 1.2 [2] 4.5 0.56 -0.8 [3] 0.4 0.5 1.7 > dimnames(asia.data)<-list(row.name,col.name) > asia.data GDP POP INFLAT P.R.China 1.4 12.92 1.2 Japan 4.5 0.56 -0.8 KOREA 0.4 0.5 1.7 > dimnames(asia.data) [[1]]: [1] "P.R.China" "Japan" "KOREA" [[2]]: [1] "GDP" "POP" "INFLAT"
中国人民大学统计学院
1 、矩阵2. 矩阵元素的表示:矩阵 a 中第 i,j 位置的元素表示为: a[i,j] ,比如: > asia.data[2,1:2] GDP POP 4.5 0.56 例 7 续 : > asia.data[2,] GDP POP INFLAT 4.5 0.56 -0.8 > asia.data["Japan","POP"]<-59# 可以用行名或列名直接提取行或列
向量 > asia.data["Japan","POP"] 59
中国人民大学统计学院
1 、矩阵3. 矩阵的运算:( 1 )元素对元素的加、减、乘、除法运算是向量的运算的确延拓。
( 2 )一个数与矩阵的运算相当于数与矩阵的每一个元素的运算。( 3 )矩阵用 %*% 表示: > a [,1] [,2] [1,] 1 3 [2,] 2 4
( 4 ) > x<-c(2,1) > a%*%x [,1] [1,] 5 [2,] 8
> solve(a)
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
思考题 4. 计算 asia.data 中的人均 GDP.
中国人民大学统计学院
1 、矩阵4. 矩阵的合并 : 增加若干列用 cbind 函数,增加若干行用 rbind 函
数;求矩阵列数用 cnol 表示,求解矩阵行数用 rnol 表示 : > a [,1] [,2] [1,] 1 3 [2,] 2 4 > addc<-c(5,6) > a<-cbind(a,addc) > a addc [1,] 1 3 5 [2,] 2 4 6
思考题 5. 在 asia.data 中插入 Australia 数据: GDP:0.53;POP:0.10;INFL:2.
3.
中国人民大学统计学院
二、数组数组则是多维矩阵,生成数组与生成矩阵类似:> a<-array(1:24,c(3,4,2))> a , , 1 [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 , , 2 [,1] [,2] [,3] [,4] [1,] 13 16 19 22 [2,] 14 17 20 23 [3,] 15 18 21 24
中国人民大学统计学院
2. 数组的行列计算函数: apply(data,dim,function,...) 例 1.7 续:计算 asia.data 中 GDP,POP,INFLAT 的最小值:
> apply(asia.data,2,min) GDP POP INFLAT 0.4 0.5 -0.8例 1.7 续 :求数组 asia.data 中的最小值所在的行和列: > col(a)[asia.data==min(asia.data)] > 3 > row(a)[asia.data==min(asia.data)] > 2思考题 6. 请输出 asia.data 中 GDP 最小值所在的行和
列 .
中国人民大学统计学院
三、数据框架 数据框架可以理解为二维数据表,其中不同
列具有不同的数据类型。 > asia.frame<-data.frame(asia.frame,IS.
AS) > asia.frame GDP POP INFLAT IS.AS P.R.China 1.4 12.92 1.2 AS Japan 4.5 0.56 -0.8 AS KOREA 0.4 0.5 1.7 AS > apply(asia.data,2,max) GDP POP INFLAT 4.5 12.92 1.7
中国人民大学统计学院
四、列表 列表是比数据框架更为松散的数据结构,列表可以
将不同类型,不同长度的数据打包,而数据框架中要求被插入的数据长度和原来的长度是一致的。
> IS.AS<-c("P.R.China","Japan","KOREA") > list(asia.frame,country) [[1]]: GDP POP INFLAT IS.AS P.R.China 1.4 12.92 1.2 AS Japan 4.5 0.56 -0.8 AS KOREA 1.4 4.5 0.4 AS [[2]]: [1] "P.R.China" "Japan" "KOREA"
中国人民大学统计学院
第四节 数据处理1. 从键盘输入数据 : 例 8: > x_scan( ) 1: 23 45 68 8 5: 34 7 7: > x [1] 23 45 68 8 34 72. 读入矩阵: 例 9: > matrix(scan("c:\\data\\wh.txt"),,3) V1 V2 V3 1 0.64 0.32 0 2 0.28 0.14 1 3 0.00 1.23 0
中国人民大学统计学院
第四节 数据处理3. 读入数据框架 : >a_read.table("c:\\data\\wh.txt",header=T)
V1 V2 V3 1 0.64 0.32 0 2 0.28 0.14 1 3 0.00 1.23 0
中国人民大学统计学院
第四节 数据处理编写函数 :
常用的函数控制命令及语法如下所示: 1. 控制结构: if (condition) { 语句 1} else
{ 语句 2}2. 循环结构:
for ( 变量 in 序列 ) 语句 while ( condition) 语句 repeat ( 语句 )
3. 跳出: break
中国人民大学统计学院
举例例 11 :计算 1,2,… 数列的连乘积,直到积大于
105. \small\begin{verbatim} > n<-0 #iteration counter > times.so.far<-1 while (times.so.far<=10^5) { n <-n+1 times.so.far <-times.so.far*n }
中国人民大学统计学院
常用统计函数
dnorm(x): 计算标准正态分布点 x 处的密度值 ;
pnorm(x,2,1) : 计算均值为 2 ,标准差为 1的正态分布点 x 处的分布函数值 P(X<x);
qnorm(p,3,2) : 计算均值为 3 ,标准差为 2的正态分布 p- 分位数 ;
rnorm(n) : 产生标准正态分布伪随机数 n 个 .
中国人民大学统计学院
中国人民大学统计学院
x <- 1:20y <- x**3plot(x,y)points(rev(x),y) lines(x,5432-0.5*y) points(x^0.5,y,pch=3) #add crosses points(x,8000-y,pch="$") #use a dollar symbol lines(x,y,lwd=4) # thick line lines(rev(x),y,lty=2) # dashed line plot(x,y,xlab="X Is Across",ylab="Y is Up") title("Titles are Tops") text(6,4000,"This goes anywhere")
第五节 S-Plus 图形功能
中国人民大学统计学院
5 10 15 20
X Is Across
020
0040
0060
0080
00
Y is
Up
Titles are Tops
This goes anywhere
5 10 15 20
x
020
0040
0060
0080
00
y
$ $ $ $ $$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
中国人民大学统计学院
中国人民大学统计学院
作图:继续
y <- rt(200, df = 5)
qqnorm(y)
qqline(y, col = 2)
-3 -2 -1 0 1 2 3
Quantiles of Standard Normal
-6
-4
-2
02
y
x <- seq(-10, 10, length= 30)
y <- x
f <- function(x,y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
persp(x, y, z)
中国人民大学统计学院
本章内容回顾
熟悉在 S-Plus 命令行中 S-Plus 基本数据处理 熟悉在 S-Plus 命令行中进行基本数据基本运
算 编写简单的计算函数 绘制基本图形