You are on page 1of 36

R 语言—快速入门手册

R 语言与统计分析 – 华东师范大学 金融与统计学院 -1-


参考文档
 R in a few hours – a brief introduction
 Basic graphics in R
 R for Beginners: 中文版, 英文版
 An Introduction to R(R 导论 ): 中文版, 英文版
 An ABC introduction to R
 R Reference Card
by Tom Short( 中文版, Ding)
 R常见问题解答,by 刘思喆 , 2008-07-24

R 语言与统计分析 – 华东师范大学 金融与统计学院 -2-


R 的语法与数据结构
 求助
• >help.start() --- 启动 R 的 Web 帮助
• > ? rnorm
• >help(rnorm) 与上面等价
• >apropos(“norm”) --- 获得带” norm” 的函数
• >args(rnorm) --- 得到 rnorm 的自变量列表
 R 程序包的安装
• 菜单方式:程序包 => 安装程序包 => 选择 CRAN 服务器 =>…
• 命令方式 , 以安装 doBy 为例
> install.packages(“doBy”)
> library(doBy) --- 加裁程序包 --- 每一次使用前都需要加裁 !
 R 命令和名称大小写敏感!

R 语言与统计分析 – 华东师范大学 金融与统计学院 -3-


 语法
 符号
• > 命令或运算提示符
• + 续行符
 基本算术运算
• + 加号
• - 减号
• * 乘号
• / 除号
• ^ 乘方
 赋值符
• = 或 <-
R 语言与统计分析 – 华东师范大学 金融与统计学院 -4-
例子:
>3+5
>3-5
>3/5
>3^5
>”^”(8,1/3) # =8^(1/3)
>x=5
>(10+2)*2
>n <- (10+2)*5
>x <- x+x
R 语言与统计分析 – 华东师范大学 金融与统计学院 -5-
 逻辑运算
• == ( 相等 )
• ! = ( 不等 )
• | (或)
• &(与)
• 逻辑值 : TRUE ( 或 T) , FALSE ( 或 F)
例子:
 7!=6
 !(7==6)
 (7==9)|(7>0)
 (7==9)&(7>0)
 c(13,4,9,-7,18)>7

R 语言与统计分析 – 华东师范大学 金融与统计学院 -6-


重要的数据结构
 向量
 向量是 R 中最为基本的类型
 一个向量中元素的类型必须相同,包括
• 数值型
 整型
 单精度实型
 双精度实型
• 逻辑型
• 复值型
• 字符型

R 语言与统计分析 – 华东师范大学 金融与统计学院 -7-


 建立数值向量的方法 ( 函数 )
• seq() 或 : 若向量 ( 序列 ) 具有较为简单的规律
• rep() 若向量 ( 序列 ) 具有较为复杂的规律
• sequence() 若向量 ( 序列 ) 为整数序列

• c() 若向量 ( 序列 ) 没有什么规律


例子:
> seq(1,10,by=0.5) = seq(from=1,to=10,by=0.5)
> seq(1,10,length=21) = seq(1,10,length.out=21)
> rep(2:5,2) = rep(2:5, times=2)
> rep(c(2,5),c(2,4))
> rep(2:5,rep(2,4))
> rep(1:3, times = 4, each = 2)
> sequence(c(3,2)) # the concatenated sequences 1:3 and 1:2.
R 语言与统计分析 – 华东师范大学 金融与统计学院 -8-
 数值向量的运算,例子
• > 5+c(4,7,17)
• > 5*c(4,7,17)
• > c(-1,3,-17)+c(4,7,17)
• > c(2,4,5)^2
• > sqrt(c(2,4,25))
• > mean(c(2,4,9))
• > var(c(2,4,9))
 字符向量
• > c(“green”,”blue sky”,”-99”)

R 语言与统计分析 – 华东师范大学 金融与统计学院 -9-


 作为因子 (factor) 的向量
• 将字符向量转换成因子
 a <- c("green", "blue", "green", "yellow")
 factor(a)
• 将数值向量转换成因子
 b<- c(1,2,3,1)
 b<-factor(b)
• 给因子 b 的水平命名
 levels(b) <- c("low", "middle", "high")

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 10 -


 向量运算中的循环法则 (recycling rule)
 1  1  1  2  
  2  2  4  
1   2
>1:2+1:4 2 + =  +  =  
   3 1  3  4  
       
4
  2  4  6  
1  1  1  2
2  2  2  4
1     
2 3  3  3  6 产生警告:长向量并非是
>1:4+1:7          
+ 4 =  4+  4 =  8 短向量的整数倍
3
  5  1  5  6
4        
6  2  6  8
7  3  7  10 
     

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 11 -


 向量的下标 (index) 与向量子集 ( 元素 ) 的提取
• 正的下标 提取向量中对应的元素
• 负的下标 去掉向量中对应的元素
• 逻辑运算 提取向量中元素的值满足条件的元素
注: R 中向量的下标从 1 开始,这与通常的统计或数学软件
一致 . 而象 C 语言等计算机高级语言的向量下标则从 0
开始!
例子:
>x = c(42,7,64,9)
>x[1]
>x[-2]
>x[c(1,4)]

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 12 -


>x>10 # 值大于 10 的元素逻辑值
[1] TRUE FALSE TRUE FALSE
>x[x>10] # 值大于 10 的元素
[1] 42 64
>x[x<40&x>10]
> # 产生 (0,1) 上 100 个均匀分布随机数
>y = runif(100, min = 0, max = 1)
>sum(y<0.5) # 值小于 0.5 的元素的个数
[1] 47
>sum(y[y<0.5]) # 值小于 0.5 的元素的值的和
[1] 10.84767
R 语言与统计分析 – 华东师范大学 金融与统计学院 - 13 -
 矩阵
 矩阵的建立
• > v<-1:8
• > m<-matrix(v,2,4) 按列加裁
• > m<-matrix(v,2,4, byrow=TRUE) 按行加裁
• > dim(m) [c.f. 向量用 length()]
 矩阵的下标 (index) 与向量子集 ( 元素 ) 的提取
• 规则 : 同向量的下标,例子
• >m[2,3]
• >m[1:2,c(2,4)]
• m[2, ]; m[,3]
• m[,-c(1,3)]
R 语言与统计分析 – 华东师范大学 金融与统计学院 - 14 -
 对矩阵的运算(函数)
• 求均值 , 中位数等
 m<-matrix(rnorm(n=12),nrow=3)
 apply(m, NARGIN=1, FUN=mean) -- 求各行的均值
 apply(m, NARGIN=2, FUN=mean) -- 求各列的均值
 row.med <- apply(m, MARGIN=1, FUN=median)
• 标准化
 scale(m, center=T, scale=T)
• 减去中位数
 sweep(m, MARGIN=1, STATS=row.med, FUN=”-”)

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 15 -


 数据框 (data frame)
 许多数据集是数据框的形式出现
 一个数据框就是将许多向量组合起来的一个对象,它是二维的,
通常其列表示变量,其行表示观测。
 建立数据框的方法 ( 函数 )
• 若你的数据本身保存在一个文件中,则可以使用
 read.table() 仅接受带有分界符的 ASCII 数据
如果数据是电子报表的形式,则采用下面的两种变

 read.csv() 先将数据另存为带逗号的数据 (Comma
Seperated values)
 read.delim() 先将数据另存为用 tab 作为分界符的数据
注:若数据集很大 ( 如 1,000,000 观测 x200 变量 ) ,则可由
ODBC 联接由数据库读入 .

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 16 -


• 若你在 R 中建立了一些向量并试图想由它们生成数据框,则可以使用
data.frame() ,但需要同时 cbind().
例子:
>x=c(42,7,64,9)
>y=1:4
>z.df=data.frame(cbind(INDEX = y, VALUE = x))
>z.df
INDEX VALUE
1 1 42
2 2 7
3 3 64
4 4 9
注  .df 只是为了提醒自己 z.df 是一个数据框架
 INDEX 和 VALUE 是重新命名的向量名字
R 语言与统计分析 – 华东师范大学 金融与统计学院 - 17 -
 适用于数据框的函数
先导入 R 自带 (built-in) 的数据集: Puromycin
> data(Puromycin)
• > help(Puromycin) --- 显示详细信息
• > head(Puromycin) --- 显示前几行
C.f >Puromycin --- 显示全部行
• summary(Puromycin) --- 显示主要的描述性统计量
• pairs(Puromycin) --- 所有变量对的散点图列阵
• xtabs(~state + conc, data= Puromycin) --- 显示交叉变量的
频数

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 18 -


 数据框的下标与子集的提取 : 同矩阵
• > Puromycin[1, 1]
• > Puromycin[c(1, 3, 5), c(1, 3)]
• > Puromycin[c(1, 3, 5), c("conc", "state")]
• > Puromycin[c(1, 3, 5), ] --- 取出整个行 ( 观测值 )
• > Puromycin$conc --- 取出变量的值
 增加新的变量
• > Puromycin$iconc <- 1/Puromycin$conc --- 基本方法
• > Puromycin$iconc <- with(Puromycin, 1/conc)
--- 使用 with 函数
• > Puromycin <- transform(Puromycin, iconc = 1/conc, +
sqrtconc = sqrt(conc)) --- 使用 transform 函数
• > head(Puromycin)

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 19 -


 提出满足条件的子集 ( 观测值 )
• > subset(Puromycin, state == "treated" & rate > 160)
• > subset(Puromycin, conc > mean(conc))
 分组计算
• > install.packages(“doBy”)
• > library(doBy)
• > summaryBy(conc ~ state, data = Puromycin, +
FUN = c(mean,median,var))
 排序
• > PuromycinOrder <- orderBy(~conc, data = Puromycin)
• > head(PuromycinOrder)

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 20 -


 列表 (list)
 复杂的数据分析时,仅有向量与数据框架还不够 , 有时需
要生成包含不同类型的对象
 R 的列表 (list) 就是包含任何类型的对象
例子 :
>foo <- list(x = 1:6, y = matrix(1:4, nrow = 2))
>foo
$x
[1] 1 2 3 4 5 6
$y
[,1] [,2]
[1,] 1 3
[2,] 2 4
R 语言与统计分析 – 华东师范大学 金融与统计学院 - 21 -
 列表子集的提出取
• 提取一个子对象如 foo 的 x, 下面三种方式等价
> foo$x
>foo[1]
>foo[[1]]
例子
>foo$y
>foo[2]
>foo[[2]]
>foo[[1]][2]
>foo$x[2]
>foo$y[4]
R 语言与统计分析 – 华东师范大学 金融与统计学院 - 22 -
 数据的存贮
 写数据
注:目录的分割符为 / 或 \\
• 存为纯文件数据
• 1. 将数据框写为 txt 文件
> d <- data.frame(obs = c(1, 2, 3), treat = c("A", "B“, "A"), +
weight = c(2.3, NA, 9))
> write.table(d, file = "c:/data/foo.txt",row.names = F,
quote = F)
2. 将数据框写为 csv 文件
> write.csv(d, file = “c:/data/foo.csv", row.names = F,
quote = F)
(C.f. write.csv2)
• 存为 R 数据格式 (. Rdata)
> save(d, file = “c:/data/foo.Rdata")

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 23 -


 读数据
• > foo <- read.table(file = “c:/data/foo.txt", header = T)

• > foo <- read.csv(file = “c:/data/foo.csv", header = T)


(C.f. read.csv2)
• 读取 Excel 数据 ---1
• > library(RODBC)

• > z <- odbcConnectExcel(“c:/data/foo.xls")

• > foo <- sqlFetch(z, "Sheet1")

• > close(z)

• 读取 Excel 数据 ---2
• open the Excel spreadsheet=>mark the desired area

• =>copy it to the clipboard=>


> foo <- read.delim("clipboard")
• 加载 R 数据框 load("d:/foo.Rdata")

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 24 -


 条件语句
 作用 : 避免除零或负数的对数等数学问题
 形式 1 :
if ( 条件 ) 表达式 1 else 表达式 2
 形式 2 – 常优于形式 1 !
ifelse( 条件 , yes, no)
试比较下面的三个结果:
>x = c(6:-4)
> sqrt(ifelse(x >= 0, x, NA))
> ifelse(x >= 0, sqrt(x), NA)
>if (x >= 0) sqrt(x) else NA
R 语言与统计分析 – 华东师范大学 金融与统计学院 - 25 -
 循环 (loops)
 for() # 若知道终止条件
for ( 变量 in 向量 ) 表达式
 while() # 若无法知道运行次数
while( 条件 ) 表达式
 两者通常可以转换
例 1— 试比较两种方法
>for (i in 1:5) print (1:i)
>i=1
>while(i <= 5) {
+ print(1:i)
+ i = i+1
+}

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 26 -


 向量化 (vectorization)
 循环 (loops) 很有用 , 但如果能将一组命令向量化,则应
尽量避免循环,原因在于
• C 是一种编译语言,其效率是很高的; R 则是一种解释语言。
在计算时,通常 C 要比 R 快 100 倍。
• 在 R 中充分使用向量化,因为 R 会立即调用 C 进行运算,因
而大大提高计算的效率!
 例子 -–- 见 Ko-Kang Wang’s “R Programming
Workshop”, pp9-11 (Gamma 函数作图 )
• Vector_1.R 没有使用向量和循环的源程序
• Vector_2.R 使用 for 循环改进后的源程序
• Vector_3.R 使用向量化后源程序

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 27 -


 函数
 函数是一系列语句的组合,在 R 中可以写出自己的函数
 形式 : 变量名 = function( 变量列表 ) 函数体
 函数引用 : 变量名 ( 变量的值 )
 函数可以递归引用,但不提倡!
 例子 – 使用 gamma 函数求 n!
>factorial = function(n) {
+ if (n>=0) gamma(n+1)
+ else print(“Please input a positive integer!")
+}
>factorial(6)
>factorial(-6)
R 语言与统计分析 – 华东师范大学 金融与统计学院 - 28 -
 用于处理错误的函数 – 用于处理用户输入不正确的类型而可
能出现的错误
• warning() 若错误不严重以至影响整个计算
• stop() 若错误可能导致计算中止
• print() 显示必要的信息
• formatC() 数值作为字符串输出
• cat() 字符串联,可以插入 \n( 换行 ) 及 \t(tab 键 )
• paste() 字符粘贴 ( 非字符型自动转换 )
例子:
> cat("R", "is","a good", "software.\n")
> formatC(1/3, format = "f", digits = 4)
> formatC(1/3, format = "e", digits = 4)
> paste(1:12) # 与 as.character(1:12) 等价
> paste("A", 1:6, sep = "")
> paste("today is", date())
R 语言与统计分析 – 华东师范大学 金融与统计学院 - 29 -
R 的图形功能
 R 语言提供二种作图方法
 使用 R 的标准作图方法:
使用 plot() 建立基本的图形,然后添加线 (lines) 和文本
(text) 等。其中 plot() 函数提供了丰富的作图符号、线型
、颜色以及标题、坐标等。
 使用“ lattice” 软件包的 trellis 作图功能,其主要的作图函
数是 xyplot() 。它尤其适合于展示二个变量之间的关系如
何随第三个变量而变化的。

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 30 -


作图函数
a. 高层次命令
 plot()
 hist()
 boxplot()
 pair()
b. 低层次作图命令
 points(), lines(), abline(), text(), axis()
c. lattices 包提供其它作图命令,如
xyplot(), bwplot(), histogram() 等

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 31 -


 单一的散点图
 简单的散点图
head(Puromycin)
PuroA <- subset(Puromycin, state == "treated")
plot(rate ~ conc, data = PuroA)
 指明数据集有三种方式
1. plot(rate ~ conc, data = PuroA)
2. with(PuroA, plot(conc, rate))
3. plot(PuroA$conc, PuroA$rate)

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 32 -


R 中的编程
 编程的重要性
 一个统计软件 ( 包 ) 应该包罗万象—所有统计方法或技术
,可以完成所有的任务??
 这是一种错误的观点!!
• 太贵!!
• 费时!!
• SAS 是一个世界上最为优秀的统计分析软件之一,但……!
!当然 SAS 具体编程能力 . SPSS !
• 通过编程可以实现 ( 开发 ) 满足自己需要的函数或宏包

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 33 -


好的编程习惯
 为了他人,更为你本人 ! 你的程序应该具有
• 可读性 (readability)

• 可理解性 (understandability)

 习惯之一:行前缩进 (Indentation), 在此推荐使用软件


• WinEdt => 已开发了基于 WinEdt 的 R 使用平台

 习惯之二:增加注释 (Commenting), 它是你的帮助


R 中使用 # 作为注释语句的开始 .
 习惯之三:变量的命名 , 使用意义明确的名字,切忌使
用人或宠物的名字

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 34 -


例子 – 缩进
> for(i in 1:1522) {
+ gene.aov <- aov(Intensity ~ A + T + A * T,
+ sub = G == i)
+ res.mat[i, ] <- residuals(gene.aov)
+ coef.mat[i, ] <- coef(gene.aov)
+}

>for(i in 1:1522)
> {
+ gene.aov <- aov(Intensity ~ A + T + A * T,
+ sub = G == i)
+ res.mat[i, ] <- residuals(gene.aov)
+ coef.mat[i, ] <- coef(gene.aov)
+ }
R 语言与统计分析 – 华东师范大学 金融与统计学院 - 35 -
 实例演示
 1 . Julian Faraway 提供的一个简短的入门
   Introduction to R
• 使用 R GUI
• 使用 R Commander
• 使用 R_WinEdt  
Further reference: Moore's The Basic Practice of Statistics,
Third Edition (Freeman, 2003),
 2. John Verzani 提供的统计学入门
  SimpleR --- Using R for Introductory Statistics
• 使用 R_WinEdt

R 语言与统计分析 – 华东师范大学 金融与统计学院 - 36 -

You might also like