【陆勤笔记】《R语言与统计分析》R的基本原理与核心
概要
R的基本原理
R的求助方法
R的主要数据结构
R的图形功能
R的编程方法
R默认命令提示符“>”,表示正在等待输入命令,在同一行中输入多个命令语句,则需要使用分号隔开。
R是一种解释型语言。输入命令后能够被直接解释和执行。
R运行时,所有变量、数据、函数及结果都以对象的形式存入计算机的活动内存中,并有相应的名字代号。
R的帮助划分为两类:
关于R的基本知识,使用命令help.start()
关于R中的函数或者关键字符,help()函数或者?函数名
模糊查询,命令apropos()函数
命令help.search(),列出所有帮助页面含有关键字的函数。
命令find(),获得包含关键字函数所对应的程序包。
命令args(),获得函数的自变量列表。
命令example(),获得函数所对应的实例。
一个简单R会话
数据的描述
> ?mtcars
数据的浏览与编辑
数据的浏览
> mtcars
> head(mtcars)
> names(mtcars)
数据编辑
> data.entry(mtcars)
> MTcars <- edit(mtcars)
> xnew <- edit(data.frame())
> x <- c(1, 2, 3, 4)
> x
[1] 1 2 3 4> data.entry(x)
> edit(x)
[1] 1 2 3 4> fix(mtcars)
> attach(mtcars)
> mpg
[1]21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.414.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 [27] 26.0 30.4 15.8 19.7 15.0 21.4> table(cyl)
cyl
4 6 8
11 714
> barplot(table(cyl))
> barplot(cyl)
> stem(mpg)
Thedecimal point is at the |
10| 44
12| 3
14| 3702258
16| 438
18| 17227
20| 00445
22| 88
24| 4
26| 03
28|
30| 44
32| 49
> hist(mpg)
> boxplot(mpg)
> mean(mpg, trim=.1)
[1] 19.69615> tapply(mpg, cyl, mean)
4 6 8
26.66364 19.74286 15.10000
> mean(mpg[cyl == 4])
[1] 26.66364> IQR(mpg)
[1] 7.375> quantile(mpg)
0% 25% 50% 75% 100%
10.400 15.425 19.200 22.800 33.900
> fivenum(mpg)
[1] 10.40 15.35 19.20 22.80 33.90> summary(mpg)
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.42 19.20 20.09 22.80 33.90
> sd(mpg)
[1] 6.026948> mad(mpg)
> plot(cyl, mpg)
> plot(hp, mpg)
> plot(hp, mpg, pch=cyl)
> legend(250, 30, pch=c(4, 6, 8),legend=c("4 cylinders", "6 cylinders", "8cylinders"))
> z <- lm(cyl ~ mpg)
> z
Call:
lm(formula = cyl ~ mpg)
Coefficients:
(Intercept) mpg
11.2607 -0.2525
> cor(cyl, mpg)
[1] -0.852162> cor(cyl, mpg) ^ 2
[1] 0.72618> lm.res <- lm(cyl ~ mpg)
> lm.resids <- resid(lm.res)
> plot(lm.resids)
> hist(lm.resids)
> qqnorm(lm.resids)
> detach(mtcars)
> q()
R的数据结构
所有对象都有两个内在属性:类型和长度。
类型是对象元素的基本种类,共有四种
数值型
字符型
复数型
逻辑型
对象的类型和长度可以分别通过mode()函数和length()函数得到。
> x <- 1
> mode(x)
[1] "numeric"> length(x)
[1] 1> y <- 1:10
> mode(y)
[1] "numeric"> length(y)
[1] 10> a <- c("a","b")
> mode(a)
[1] "character"> length(a)
[1] 2无论什么类型的数据,缺失数据用NA表示。
> x <- 5/0
> x
[1] Inf> exp(x)
[1] Inf> exp(-x)
[1] 0> Inf – Inf
[1] NaN> 0 / 0
[1] NaN> sqrt(-1)
[1] NaN警告信息:
In sqrt(-1) : 产生了NaNs
> sqrt(-1 + 0i)
[1] 0+1i数据对象及类型总结
说明:
1)向量是R中最基本,最简单的数据结构。R语言可以理解为向量化语言。因子是一个分类变量,分类变量包括名义变量和有序变量两种形式。数组是一个k个维度的数据表,当k=2时,就是矩阵了。
2)向量、数组或者矩阵中的元素类型必须是一样的,而数据框和列表中的元素数据类型可以不一样。但是,数据框中每一列中元素的类型要一样,并且每一列的长度都要相同,而列表没有这个要求。换而言之,列表是个“大海”,可以海纳百川。
R运算符包括算术运算符、比较运算符和逻辑运算符,总结如下。
说明:逻辑与有两种形式,&和&&,前者表示作用对象中的每一个元素并且返回与元素长度相对应的逻辑值,后者表示作用于对象中的第一个元素并且返回逻辑值。逻辑或的两种形式差异,与逻辑与一样。举例说明如下:
> x <- c(1, 2)
> y <- c(0, 3)
> x & y
[1] FALSE TRUE> x && y
[1] FALSE> x | y
[1] TRUE TRUE> x || y
[1] TRUE浏览对象信息,使用ls()函数,对函数指定参数pattern的内容,可以显示某个指定字符的对象。参数pattern的内容可以是字符或者正则表达式。ls.str()会显示内存中所有对象的详细信息。该函数中max.level可以指定需要显示内容的详细级别。
在内存中删除某个对象,使用rm()函数。例如rm(list=ls())删除内存中的所有对象,但请谨慎使用。
向量的建立
数值型向量,常用函数seq()或者: rep() c() scan(),举例说明如下
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10> seq(1,10)
[1] 1 2 3 4 5 6 7 8 9 10> rep(2:5, 2)
[1] 2 3 4 5 2 3 4 5> rep(1:2, each=2)
[1] 1 1 2 2> rep(1:2, each=2, times=2)
[1] 1 1 2 2 1 1 2 2> vec1 <- c(1, 3, 5, 7)
> vec1
[1] 1 3 5 7> vec2 <- scan()
1: 10 9 8 7 6
6:
Read 5 items
> vec2
[1] 10 9 8 7 6字符型向量,常用函数c() paste(),举例说明如下
> vec3 <- c("Hello","world")
> vec3
[1] "Hello" "world"> vec4 <- paste(c("X","Y"), 1:10, sep="-")
> vec4
[1]"X-1" "Y-2" "X-3" "Y-4" "X-5" "Y-6" "X-7" "Y-8" "X-9" "Y-10"逻辑型向量,利用各种条件创建逻辑型向量或者利用c()函数把逻辑值TRUE/FALSE进行组合,举例说明如下。
> vec5 <- c(-1, 0, 1)
> vec5 > 0
[1] FALSE FALSE TRUE> vec6 <- vec5 <= 0
> vec6
[1] TRUE TRUE FALSE> vec7 <- c(TRUE, FALSE)
> vec7
[1] TRUE FALSE因子型向量,利用factor()函数,举例说明如下。
> vec8 <- c("green","red", "black")
> vec9 <- factor(vec8)
> vec9
[1] green red blackLevels: black green red
> vec10 <- c(4, 1, 2, 3)
> vec11 <- factor(vec10)
> vec11
[1] 4 1 2 3Levels: 1 2 3 4
> ff <- factor(c("B","A", "C"), levels=c(1, 2, 3))
> ff
[1] <NA> <NA> <NA>Levels: 1 2 3
> ff <- factor(c("B","A", "C"), labels=c(1, 2, 3))
> ff
[1] 2 1 3Levels: 1 2 3
> ff1 <- factor(c("B","A", "C"))
> ff1
[1] B A CLevels: A B C
> levels(ff1) <- c(1, 2, 3)
> ff1
[1] 2 1 3Levels: 1 2 3
函数gl()能产生规则的序列。
> gl(3, 5)
[1]1 1 1 1 1 2 2 2 2 2 3 3 3 3 3Levels: 1 2 3
> gl(3, 5, length=30)
[1]1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3Levels: 1 2 3
> gl(2, 6, label=c("Male","Female"))
[1]Male Male Male Male Male Male Female Female Female Female [11] Female FemaleLevels: Male Female
> gl(2,1, length=20)
[1]1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2Levels: 1 2
> gl(2, 2, length=20)
[1]1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2Levels: 1 2
数值型向量运算
向量可以用于算术运算表达式,遵循循环规则。举例说明如下:
> 10 + c(1, 2, 3)
[1] 11 12 13> c(1, 2, 3) ^ 2
[1] 1 4 9> sqrt(c(1, 2, 3))
[1] 1.000000 1.414214 1.732051> c(1, 2) + 1:4
[1] 2 4 4 6> c(1, 2, 3) + 1:4
[1] 2 4 6 5Warning message:
In c(1, 2, 3) + 1:4 :
longer object length is not a multiple of shorter object length
常用的统计函数及作用汇总
说明:函数max,min,median,var,sd,sum,cusum,cumprod,cummax,cummin对于矩阵及数据框意义有方向性。对于矩阵,cov()和cor()分别用来求矩阵的协方差阵和相关系数阵。
向量的下标与子集元素的提取
下标是正整数向量和负整数向量,前者表示获取相应下标所对应的元素值,后者表示除掉相应位置元素值后的所有剩余元素值,举例说明如下:
> data <- c(1:10)
> data[c(1,2)] [1] 1 2
> data[c(-1, -4)] [1] 2 3 5 6 7 8 9 10
字符串的向量和逻辑向量下标,举例说明如下。
> data1 <- c(1, 2, 3)
> names(data1) <- c("A","B", "C")
> data1
A B C
1 2 3
> data1["A"]
A
1
> data1 > 2
A B C
FALSE FALSE TRUE
> data1[data1 > 2]
C
3
> data1[c(TRUE,FALSE)]
A C
1 3
数组与矩阵的建立
数组的创建,使用array()函数,举例说明如下。
> array1 <- array(1:8, c(2, 2, 2))
> array1
, , 1
[,1] [,2] [1,] 1 3
[2,] 2 4, , 2
[,1] [,2] [1,] 5 7
[2,] 6 8> dim(array1)
[1] 2 2 2> dimnames(array1) <-list(c("A1", "A2"), c("B1", "B2"),c("C1", "C2"))
> array1
, , C1
B1B2
A1 1 3
A2 2 4
, , C2
B1B2
A1 5 7
A2 6 8
> rownames(array1)
[1] "A1" "A2"> colnames(array1)
[1] "B1" "B2"> dimnames(array1)
[[1]] [1] "A1" "A2" [[2]] [1] "B1" "B2" [[3]] [1] "C1" "C2"矩阵的建立
矩阵是数组的特例,矩阵也可以使用array()函数建立,例如
> matrix1 <- array(1:6, c(2, 3))
> matrix1
[,1] [,2] [,3] [1,] 1 3 5
[2,] 2 4 6> matrix2 <- array(1:4, c(2, 3))
> matrix2
[,1] [,2] [,3] [1,] 1 3 1
[2,] 2 4 2或者使用matrix()函数创建
使用diag()函数建立对角矩阵
> matrix3 <- matrix(1, nrow=2,ncol=2)
> matrix3
[,1] [,2] [1,] 1 1
[2,] 1 1> diag(3)
[,1] [,2] [,3] [1,] 1 0 0
[2,] 0 1 0 [3,] 0 0 1> v <- c(10,20,30)
> diag(v)
[,1] [,2] [,3] [1,] 10 0 0
[2,] 0 20 0 [3,] 0 0 30> diag(2, nrow=4, ncol=2)
[,1] [,2] [1,] 2 0
[2,] 0 2 [3,] 0 0 [4,] 0 0> diag(2, nrow=4, ncol=4)
[,1] [,2] [,3] [,4] [1,] 2 0 0 0
[2,] 0 2 0 0 [3,] 0 0 2 0 [4,] 0 0 0 2数组与矩阵的下标与子集(元素)的提取
举例说明如下
> matrix4 <- matrix(1:6, 2, 3)
> matrix4
[,1] [,2] [,3] [1,] 1 3 5
[2,] 2 4 6> matrix4[1,2] [1] 3
> matrix4[1,] [1] 1 3 5
> matrix4[1,,drop=FALSE]
[,1] [,2] [,3] [1,] 1 3 5
> matrix4[,1] [1] 1 2
> matrix4[,1,drop=FALSE]
[,1] [1,] 1
[2,] 2矩阵的运算
代数运算
转置,使用t()函数
提取对角元,使用diag()函数
> X <- matrix(1:6, 2, 3)
> X
[,1] [,2] [,3] [1,] 1 3 5
[2,] 2 4 6> t(X)
[,1] [,2] [1,] 1 2
[2,] 3 4 [3,] 5 6> diag(X)
[1] 1 4几个矩阵按行合并rbind()函数或者按列合并cb ind()函数
> m1 <- matrix(1, 2, 2)
> m2 <- matrix(2, 2, 2)
> m1
[,1] [,2] [1,] 1 1
[2,] 1 1> m2
[,1] [,2] [1,] 2 2
[2,] 2 2> rbind(m1, m2)
[,1] [,2] [1,] 1 1
[2,] 1 1 [3,] 2 2 [4,] 2 2> cbind(m1, m2)
[,1] [,2] [,3] [,4] [1,] 1 1 2 2
[2,] 1 1 2 2矩阵的逐元乘积
> m1 * m2
[,1] [,2] [1,] 2 2
[2,] 2 2矩阵的乘法运算
> rbind(m1, m2) %*% cbind(m1, m2)
[,1] [,2] [,3] [,4] [1,] 2 2 4 4
[2,] 2 2 4 4 [3,] 4 4 8 8 [4,] 4 4 8 8> cbind(m1, m2) %*% rbind(m1, m2)
[,1] [,2] [1,] 10 10
[2,] 10 10方阵的行列式det()
> Y <- matrix(1:4, 2, 2)
> Y
[,1] [,2] [1,] 1 3
[2,] 2 4> det(Y)
[1] -2其他函数,交叉乘积crossprod()函数;特征根与特征向量eigen()函数;QR分解qr()函数。
统计运算
统计运算可以参见前面总结的常用统计函数表格。举例说明如下。
> mm <- matrix(rnorm(12), nrow=3)
> mm
[,1] [,2] [,3] [,4] [1,] 0.6749164 -0.3109625 1.7681337 -1.060834
[2,] -0.8344582 1.3685072 -1.6005624 -1.558336 [3,] 0.4438795 -0.8994712 -0.8189797 -1.242254> apply(mm, 1, mean)
[1] 0.2678134 -0.6562123 -0.6292063> mean(mm[,1])
[1] 0.09477924> apply(mm, 2, mean)
[1] 0.09477924 0.05269117 -0.21713615-1.28714130> scale(mm, center=TRUE, scale=TRUE)
[,1] [,2] [,3] [,4] [1,] 0.7135828 -0.3089905 1.1259804 0.8988648
[2,] -1.1429846 1.1180271 -0.7846343 -1.0771517 [3,] 0.4294018 -0.8090366 -0.3413461 0.1782869attr(,"scaled:center")
[1] 0.09477924 0.05269117 -0.21713615-1.28714130attr(,"scaled:scale")
[1] 0.8129921 1.1769088 1.7631478 0.2517700> row.med <- apply(mm, 1, median)
> row.med
[1] 0.1819770 -1.1963970 -0.8592254> sweep(mm, 1, row.med,FUN="-")
[,1] [,2] [,3] [,4] [1,] 0.4929394 -0.49293945 1.58615672 -1.2428111
[2,] 0.3619388 2.56490413 -0.40416542 -0.3619388 [3,] 1.3031050 -0.04024571 0.04024571 -0.3830286数据框的建立
统计分析中一个完整的数据集通常是由若干个变量的若干个观测组合而成,在R中用数据框实现。
数据框直接建立,使用data.frame()函数
> x <- c(42, 100, 88, 75)
> y <- 1:4
> df1 <- data.frame(INDEX=y, VALUE=x)
> df1
INDEX VALUE
1 1 42
2 2 100
3 3 88
4 4 75
数据框间接建立,通过从数据文件(文本文件、电子表格文件和其他统计软件文件等)中导入而建立。常用函数read.table()函数。
适用于数据框的函数
常用函数max min median var sd cumsum cumprod cummax cummin cov cor等,例如:
> attach(Puromycin)
> head(Puromycin)
conc rate state
1 0.02 76 treated
2 0.02 47 treated
3 0.06 97 treated
4 0.06 107 treated
5 0.11 123 treated
6 0.11 139 treated
> summary(Puromycin)
conc rate state
Min. :0.0200 Min. : 47.0 treated :12
1stQu.:0.0600 1st Qu.: 91.5 untreated:11
Median :0.1100 Median :124.0
Mean :0.3122 Mean :126.8
3rdQu.:0.5600 3rd Qu.:158.5
Max. :1.1000 Max. :207.0
> pairs(Puromycin, panel=panel.smooth)
> xtabs(~state + conc, data = Puromycin)
conc
state 0.02 0.06 0.11 0.22 0.56 1.1
treated 2 2 2 2 2 2
untreated 2 2 2 2 2 1
数据框的下标与子集提取
> Puromycin[1,1] [1] 0.02
> Puromycin[c(1,3,5), c(1,3)]
conc state
1 0.02 treated
3 0.06 treated
5 0.11 treated
> Puromycin$conc
[1]0.02 0.02 0.06 0.06 0.11 0.11 0.22 0.22 0.56 0.56 1.10 1.10 0.02 0.02 0.06 0.060.11 0.11 0.22 0.22 0.56 0.56 [23] 1.10> subset(Puromycin, state =="treated" & rate > 160)
conc rate state
9 0.56 191 treated
10 0.56 201 treated
11 1.10 207 treated
12 1.10 200 treated
数据框中添加新变量
举例说明如下
基本方法
> Puromycin$iconc <- 1/Puromycin$conc
> head(Puromycin)
conc rate state iconc
1 0.02 76 treated 50.000000
2 0.02 47 treated 50.000000
3 0.06 97 treated 16.666667
4 0.06 107 treated 16.666667
5 0.11 123 treated 9.090909
6 0.11 139 treated 9.090909
使用with()函数
> Puromycin$iconc1 <- with(Puromycin,1/conc)
> head(Puromycin)
conc rate state iconc iconc1
1 0.02 76 treated 50.000000 50.000000
2 0.02 47 treated 50.000000 50.000000
3 0.06 97 treated 16.666667 16.666667
4 0.06 107 treated 16.666667 16.666667
5 0.11 123 treated 9.090909 9.090909
6 0.11 139 treated 9.090909 9.090909
使用transform()函数
> Puromycin1 <- transform(Puromycin,sqrtconc=sqrt(conc))
> head(Puromycin1)
conc rate state iconc iconc1 sqrtconc
1 0.02 76 treated 50.000000 50.000000 0.1414214
2 0.02 47 treated 50.000000 50.000000 0.1414214
3 0.06 97 treated 16.666667 16.666667 0.2449490
4 0.06 107 treated 16.666667 16.666667 0.2449490
5 0.11 123 treated 9.090909 9.090909 0.3316625
6 0.11 139 treated 9.090909 9.090909 0.3316625
列表的建立
R的列表就是包含任何类型的对象。
列表使用函数list()创建。
举例说明如下
> L1 <- list(1:6, matrix(1:4,nrow=2))
> L1
[[1]] [1] 1 2 3 4 5 6 [[2]][,1] [,2] [1,] 1 3
[2,] 2 4> L2 <- list(vec1=1:6,matrix1=matrix(1:4, nrow=2))
> L2
$vec1
[1] 1 2 3 4 5 6$matrix1
[,1] [,2] [1,] 1 3
[2,] 2 4> L2[1]
$vec1
[1] 1 2 3 4 5 6> L2[[1]] [1] 1 2 3 4 5 6
> L2$vec1
[1] 1 2 3 4 5 6时间序列的建立
时间序列由函数ts()通过一个向量或者矩阵创建一个一元的或者多元的的时间序列,它称为ts对象。
> ts(1:10, start=2000)
Time Series:
Start = 2000
End = 2009
Frequency = 1
[1] 1 2 3 4 5 6 7 8 9 10> ts(1:47, frequency=12, start=c(2000,2))
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2000 1 2 3 4 5 6 7 8 9 10 11
2001 12 13 14 15 16 17 18 19 20 21 22 23
2002 24 25 26 27 28 29 30 31 32 33 34 35
2003 36 37 38 39 40 41 42 43 44 45 46 47
> ts(1:10, frequency=4, start=c(2000,2))
Qtr1 Qtr2 Qtr3 Qtr4
2000 1 2 3
2001 4 5 6 7
2002 8 9 10
> ts(matrix(rpois(36,5), 12, 3),start=c(2000, 2), frequency=12)
Series 1 Series 2 Series 3
Feb 2000 10 4 3
Mar 2000 3 4 8
Apr 2000 5 7 3
May 2000 1 4 7
Jun 2000 6 6 4
Jul 2000 5 7 4
Aug 2000 6 3 6
Sep 2000 6 6 5
Oct 2000 4 4 1
Nov 2000 2 4 4
Dec 2000 4 4 4
Jan 2001 9 6 6
数据的存取与读取
数据的存取
保存为文本文件,使用函数write.table()函数或者save()函数
举例说明如下
> d <- data.frame(obs=c(1,2,3),treat=c("A","B","A"),weight=c(2.3, NA, 9))
> d
obstreat weight
1 1 A 2.3
2 2 B NA
3 3 A 9.0
保存为简单的文件,行名不写入文件,变量名不被双引号包含。
> write.table(d,file="c:/TestData/foo.txt", row.names=FALSE, quote=FALSE)
保存为逗号分隔的文件
> write.csv(d,file="c:/TestData/foo.csv", row.names=FALSE, quote=FALSE)
保存为R格式的文件
> save(d,file="c:/TestData/foo.Rdata")
空间的映像保存下来
>save.image(file="C:/TestData/.Rdata")
等价于
save(list=ls(all=TRUE),file="C:/TestData/.Rdata")
数据的读取
文本文件数据的读取
R可以使用这些函数读取存储在文本文件(ASCII)中的数据:read.table()、scan()和read.fwf()函数。
Excel数据的读取
有两种简单的方法,一种是使用剪贴板,具体操作:打开Excel中的电子表格,选中需要的数据区域,再复制到剪贴板,然后在R中键入命令。
mydata <-read.delim("clipboard")
另一种使用RODBC程序包。
R中数据集的读取
R的标准数据datasets
使用data()函数查看
专用程序包的数据集
R格式的数据
R格式的数据使用load()函数加载
其它统计软件数据的读取
具体方法可以查阅R官方技术文档《R数据导入和导出手册》
R图形功能
R具有强大的绘图功能
先看一下R提供的两组图形Demo
demo(graphics)#二维图形示例
demo(graphics)#三维图形示例
R中提供两种绘图函数
高级绘图函数:创建一个新的图形。
低级绘图函数:在现存的图形上面添加元素。
R中高级绘图函数
绘图函数主要共同选项
R中低级绘图函数
绘图参数
绘图参数可以进行设置或者通过par()函数来设置绘图参数。
常用的绘图参数。
R编程
从统计语言和编程的角度来认识和应用R
循环和向量化
控制结构
条件结构
循环结构
向量化
向量化编程的好处
编写自己的函数
大多数R的工作是通过函数来实现的,而且这些函数的输入参数都放在一个括弧里面,用户可以编写自己的函数。
良好的变成习惯
为了他人,也为了自己,你的程序应该具有
可读性
可理解性
四个良好习惯
习惯一:采用结构化、模块化编程
习惯二:增加注释
习惯三:命名能够有明确含义
习惯四:格式缩进
练习题
【互动交流】
无论您是投资人,创业者,还是从业者,R语言爱好者,愿意深入交流的朋友,请给陆勤留言或者添加陆勤微信:luqin360。
谢谢您的关注,祝好。
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!