36
- - 1 - - R 语语语 语语语 语语语语语语 语语语 语语语 R 语语—语语语语语语

Part2. R快速入门手册

Embed Size (px)

Citation preview

Page 1: Part2. R快速入门手册

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

R 语言—快速入门手册

汤银才

Page 2: Part2. R快速入门手册

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

参考文档R in a few hours – a brief introductionBasic graphics in RR for Beginners: 中文版 , 英文版An Introduction to R(R 导论 ): 中文版, 英文版An ABC introduction to RR Reference Card

by Tom Short( 中文版, Ding)R 常见问题解答 ,by 刘思喆 , 2008-07-24

Page 3: Part2. R快速入门手册

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

求助• >help.start() --- 启动 R 的 Web 帮助• > ? rnorm• >help(rnorm) 与上面等价• >apropos(“norm”) --- 获得带” norm” 的函数• >args(rnorm) --- 得到 rnorm 的自变量列表

R 程序包的安装• 菜单方式:程序包 => 安装程序包 => 选择 CRAN 服务器 =>

…• 命令方式 , 以安装 doBy 为例

> install.packages(“doBy”)> library(doBy) --- 加裁程序包 --- 每一次使用前都需要加裁 !

R 命令和名称大小写敏感!

R 的语法与数据结构

Page 4: Part2. R快速入门手册

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

语法 符号

• > 命令或运算提示符• + 续行符

基本算术运算• + 加号 • - 减号• * 乘号• / 除号• ^ 乘方

赋值符• = 或 <-

Page 5: Part2. R快速入门手册

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

例子:>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

Page 6: Part2. R快速入门手册

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

逻辑运算• == ( 相等 )• ! = ( 不等 )• | ( 或 )• & ( 与 )• 逻辑值 : TRUE ( 或 T) , FALSE ( 或 F)

例子: 7!=6 !(7==6) (7==9)|(7>0) (7==9)&(7>0) c(13,4,9,-7,18)>7

Page 7: Part2. R快速入门手册

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

向量 向量是 R 中最为基本的类型 一个向量中元素的类型必须相同,包括

• 数值型 整型 单精度实型 双精度实型

• 逻辑型• 复值型• 字符型

重要的数据结构

Page 8: Part2. R快速入门手册

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

建立数值向量的方法 ( 函数 )• 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.

Page 9: Part2. R快速入门手册

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

数值向量的运算,例子• > 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”)

Page 10: Part2. R快速入门手册

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

作为因子 (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")

Page 11: Part2. R快速入门手册

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

向量运算中的循环法则 (recycling rule)

>1:2+1:4

>1:4+1:7

1 1 1 2

1 2 2 2 4

2 3 1 3 4

4 2 4 6

1 1 1 2

2 2 2 41

3 3 3 62

4 4 4 83

5 1 5 64

6 2 6 8

7 3 7 10

产生警告:长向量并非是短向量的整数倍

Page 12: Part2. R快速入门手册

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

向量的下标 (index) 与向量子集 ( 元素 ) 的提取• 正的下标 提取向量中对应的元素• 负的下标 去掉向量中对应的元素• 逻辑运算 提取向量中元素的值满足条件的元素注: R 中向量的下标从 1 开始,这与通常的统计或数学软件 一致 . 而象 C 语言等计算机高级语言的向量下标则从 0 开

始!例子:>x = c(42,7,64,9)

>x[1]

>x[-2]

>x[c(1,4)]

Page 13: Part2. R快速入门手册

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

>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

Page 14: Part2. R快速入门手册

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

矩阵 矩阵的建立

• > 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)]

Page 15: Part2. R快速入门手册

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

对矩阵的运算(函数)• 求均值 , 中位数等

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=”-”)

Page 16: Part2. R快速入门手册

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

数据框 (data frame) 许多数据集是数据框的形式出现 一个数据框就是将许多向量组合起来的一个对象,它是

二维的,通常其列表示变量,其行表示观测。 建立数据框的方法 ( 函数 )

• 若你的数据本身保存在一个文件中,则可以使用 read.table() 仅接受带有分界符的 ASCII 数据 如果数据是电子报表的形式,则采用下面的两种变型 read.csv() 先将数据另存为带逗号的数据 (Comma

Seperated values) read.delim() 先将数据另存为用 tab 作为分界符的数据

注:若数据集很大 ( 如 1,000,000 观测 x200 变量 ) ,则可由 ODBC联接由数据库读入 .

Page 17: Part2. R快速入门手册

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

• 若你在 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 VALUE1 1 422 2 73 3 644 4 9注 .df 只是为了提醒自己 z.df 是一个数据框架

INDEX 和 VALUE 是重新命名的向量名字

Page 18: Part2. R快速入门手册

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

适用于数据框的函数先导入 R 自带 (built-in) 的数据集: Puromycin> data(Puromycin)

• > help(Puromycin) ---显示详细信息• > head(Puromycin) --- 显示前几行

C.f >Puromycin --- 显示全部行• summary(Puromycin) --- 显示主要的描述性统计量• pairs(Puromycin) --- 所有变量对的散点图列阵• xtabs(~state + conc, data= Puromycin) --- 显示交叉变量的频数

Page 19: Part2. R快速入门手册

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

数据框的下标与子集的提取 : 同矩阵• > 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)

Page 20: Part2. R快速入门手册

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

提出满足条件的子集 ( 观测值 )• > 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)

Page 21: Part2. R快速入门手册

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

列表 (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

Page 22: Part2. R快速入门手册

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

列表子集的提出取• 提取一个子对象如 foo 的 x, 下面三种方式等价

> foo$x>foo[1]>foo[[1]] 例子

>foo$y

>foo[2]

>foo[[2]]

>foo[[1]][2]

>foo$x[2]

>foo$y[4]

Page 23: Part2. R快速入门手册

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

数据的存贮 写数据

注:目录的分割符为 / 或 \\• 存为纯文件数据• 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")

Page 24: Part2. R快速入门手册

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

读数据• > 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")

Page 25: Part2. R快速入门手册

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

条件语句 作用 : 避免除零或负数的对数等数学问题 形式 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

Page 26: Part2. R快速入门手册

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

循环 (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 + }

Page 27: Part2. R快速入门手册

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

向量化 (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 使用向量化后源程序

Page 28: Part2. R快速入门手册

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

函数 函数是一系列语句的组合,在 R 中可以写出自己的函数 形式 : 变量名 = function( 变量列表 ) 函数体 函数引用 : 变量名 ( 变量的值 ) 函数可以递归引用,但不提倡! 例子 – 使用 gamma 函数求 n!

>factorial = function(n) { + if (n>=0) gamma(n+1) + else print(“Please input a positive integer!") + } >factorial(6) >factorial(-6)

Page 29: Part2. R快速入门手册

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

用于处理错误的函数 – 用于处理用户输入不正确的类型而可能出现的错误

• 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())

Page 30: Part2. R快速入门手册

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

R 的图形功能R 语言提供二种作图方法

使用 R 的标准作图方法:使用 plot() 建立基本的图形,然后添加线 (lines) 和文本(text) 等。其中 plot() 函数提供了丰富的作图符号、线型、颜色以及标题、坐标等。

使用“ lattice” 软件包的 trellis 作图功能,其主要的作图函数是 xyplot() 。它尤其适合于展示二个变量之间的关系如何随第三个变量而变化的。

Page 31: Part2. R快速入门手册

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

作图函数① 高层次命令 plot() hist() boxplot() pair()

② 低层次作图命令 points(), lines(), abline(), text(), axis()

③ lattices 包提供其它作图命令,如xyplot(), bwplot(), histogram() 等

Page 32: Part2. R快速入门手册

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

单一的散点图 简单的散点图

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)

Page 33: Part2. R快速入门手册

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

R 中的编程编程的重要性

一个统计软件 ( 包 ) 应该包罗万象—所有统计方法或技术,可以完成所有的任务??

这是一种错误的观点!!• 太贵!!• 费时!!• SAS 是一个世界上最为优秀的统计分析软件之一,但……!!当然 SAS 具体编程能力 . SPSS !

• 通过编程可以实现 ( 开发 ) 满足自己需要的函数或宏包

Page 34: Part2. R快速入门手册

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

好的编程习惯 为了他人,更为你本人 ! 你的程序应该具有

• 可读性 (readability)• 可理解性 (understandability)

习惯之一:行前缩进 (Indentation), 在此推荐使用软件• WinEdt => 已开发了基于 WinEdt 的 R 使用平台

习惯之二:增加注释 (Commenting), 它是你的帮助 R 中使用 # 作为注释语句的开始 . 习惯之三:变量的命名 , 使用意义明确的名字,切忌使

用人或宠物的名字

Page 35: Part2. R快速入门手册

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

例子 – 缩进> 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)+ }

Page 36: Part2. R快速入门手册

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

实例演示 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