R Notes | Set 0

这学期选了一门课,叫 Statistics Test (STAT2912)
讲的是各种奇奇怪怪的 test,包括 parametric test & non-parametric test
并不喜欢这门课,数学里最讨厌的就是统计和概率论了

最初为什么要选这门课啊 ==__== 简直是作死
但现在都第四周了,课也换不了了,只能将就着上了
lecture 也是水的很,总共十几个人,lecturer 也是照着念 slides
于是就打算自己学了,从 Youtube 上找了一系列的 R 视频
地址在这里,同时也记一些笔记,放到这里
这是这个系列笔记的第一篇

R Basic

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
> x = 11 # or use an arrow to assign variables
> x <- 11
> print(x) # or just type the variable name
> x # gives 11
> X
> 错误: 找不到对象'X' # R 里是区分大小写的
> y <- 7
> y
[1] 7
> ls() # ls() 用来查看当前 memory 中的变量
[1] "x" "y"
> 1x <- 22
错误: unexpected symbol in "1x" # 在 R 中,不能以数字开头作为变量名
>
> xx <- "Kurt" # 字符串以双引号括起来
> xx
[1] "Kurt"
> yy <- "1"
> yy
[1] "1"
> 11 + 14 # 基本的算术运算
[1] 25
> 7 * 9
[1] 63
>
> x + y # 以变量为基础进行算术运算
[1] 20
> z <- x + y
> z
[1] 20
> x - y
[1] 2
> x * y
[1] 99
> x / y
[1] 1.222222
> y ^ 2 # 平方
[1] 81
> x ^ 2 + y ^ 2
[1] 202
>
>
> sqrt(y) # square root
[1] 3
> y^(1/2) # the same effect as square root
[1] 3
> log(y) # base 10
[1] 2.197225
> exp(y) % exponential
[1] 8103.084
> log2(y) # base 2
[1] 3.169925
> abs(-14) # absolute value
[1] 14
>
>
> x1 <- c(1,3,5,7,9) # create a brunch of numbers
> x1
[1] 1 3 5 7 9
> gender <- c("male", "female") # create a brunch of strings
> gender
[1] "male" "female"
>
>
> 2:7 # 冒号表示从某个数字到某个数字的所有值
[1] 2 3 4 5 6 7
> seq(from=1, to=7, by=1) # seq() take three parameters, from, to, by (increment by some value)
[1] 1 2 3 4 5 6 7
> seq(from=1, to=7, by=0.25)
[1] 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00 4.25 4.50 4.75 5.00
[18] 5.25 5.50 5.75 6.00 6.25 6.50 6.75 7.00
> rep(1, times=10) # rep(), the first para is the value we want to repeat, the second is the repeat time
[1] 1 1 1 1 1 1 1 1 1 1
> rep("Kurt", times=5)
[1] "Kurt" "Kurt" "Kurt" "Kurt" "Kurt"
> rep(1:3, times=5)
[1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
> rep(c("n", "f"), times=5)
[1] "n" "f" "n" "f" "n" "f" "n" "f" "n" "f"

if two vectors are of the same length, we may add/subtract/multiply/divide corresponding elements

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> x
[1] 1 2 3 4 5
> y
[1] 1 3 5 7 9
> x + 7
[1] 8 9 10 11 12
> x + y
[1] 2 5 8 11 14
> x - y
[1] 0 -1 -2 -3 -4
> x * y
[1] 1 6 15 28 45
> x / y
[1] 1.0000000 0.6666667 0.6000000 0.5714286 0.5555556

由“索引”来取值,用方括号表示 [ ], 其中负号代表“除此以外”

1
2
3
4
5
6
7
8
9
10
11
12
> y[3]
[1] 5
> y[-3]
[1] 1 3 7 9
> y[1:3]
[1] 1 3 5
> y[c(1,5)]
[1] 1 9
> y[-c(1,5)]
[1] 3 5 7
> y[y<6]
[1] 1 3 5

关于 Matrix 的一些操纵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
> matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3,byrow = TRUE)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
> matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3,byrow = FALSE)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> mat = matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3,byrow = FALSE)
> mat
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> mat[1,2] # 取出第一行,第二列的元素
[1] 4
> mat[c(1,3),2] # 分别取出第一行和第三行的第二列的元素
[1] 4 6
> mat[2,] # 取出第二行,第二个参数为空表示全选
[1] 2 5 8
> mat[,1] # 取出第一列,第一个参数为空表示全选
[1] 1 2 3
> mat*10 # matrix 里的每个元素乘以10
[,1] [,2] [,3]
[1,] 10 40 70
[2,] 20 50 80
[3,] 30 60 90

Reading File

1
2
3
4
5
6
7
> LungCapData = read.table(file.choose(), header=T, sep="\t")
> LungCapData[c(1,2,3,4),]
LungCap Age Height Smoke Gender Caesarean
1 6.475 6 62.1 no male no
2 10.125 18 74.7 yes female no
3 9.550 16 69.7 no female yes
4 11.125 14 71.0 no male no

其中 read.table(file.choose(), header=T, sep=”\t”) 是读入文件一般格式。
第一个参数是选要读入的文件,一般是 file=””, 然后双引号里写文件目录。也可以直接写 file.choose(), 此时会弹出来一个窗口,允许用户选择文件。
第二个参数是 header,T 代表 TRUE
第三个参数是 sep,代表该文件里的内容是以什么分隔的,“\t” 表示这是一个以 tab 分隔的文件,文件名以 .txt 结尾
也有 sep=”,” 表示以逗号分隔,是 CSV 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
> head(LungCapData)
LungCap Age Height Smoke Gender Caesarean
1 6.475 6 62.1 no male no
2 10.125 18 74.7 yes female no
3 9.550 16 69.7 no female yes
4 11.125 14 71.0 no male no
5 4.800 5 56.9 no male no
6 6.225 11 58.7 no female no
> tail(LungCapData)
LungCap Age Height Smoke Gender Caesarean
720 7.325 9 66.3 no male no
721 5.725 9 56.0 no female no
722 9.050 18 72.0 yes male yes
723 3.850 11 60.5 yes female no
724 9.825 15 64.9 no female no
725 7.100 10 67.7 no male no
> LungCapData[1:6,]
LungCap Age Height Smoke Gender Caesarean
1 6.475 6 62.1 no male no
2 10.125 18 74.7 yes female no
3 9.550 16 69.7 no female yes
4 11.125 14 71.0 no male no
5 4.800 5 56.9 no male no
6 6.225 11 58.7 no female no

head() 会给出数据的前几行
tail() 会给出数据的后几行

1
2
3
4
5
6
7
8
> LungCapData[-(4:722),]
LungCap Age Height Smoke Gender Caesarean
1 6.475 6 62.1 no male no
2 10.125 18 74.7 yes female no
3 9.550 16 69.7 no female yes
723 3.850 11 60.5 yes female no
724 9.825 15 64.9 no female no
725 7.100 10 67.7 no male no

LungCapData[-(4:722),] 给出了除第4行到第722行以外的所有数据

1
2
3
4
> names(LungCapData)
[1] "LungCap" "Age" "Height" "Smoke" "Gender" "Caesarean"
> mean(Age)
Error in mean(Age) : 找不到对象'Age'

names() 给出了各个列的名称
mean(Age) 这一行报错是因为在 R 的内存中并没有 “Age” 这个变量
“Age” 目前还只存在于 LungCapData 这个 Data Set 中
如果想 access “Age”,有两种方法

1
2
3
4
> mean(LungCapData$Age)
[1] 12.3269
> mean(Age)
Error in mean(Age) : 找不到对象'Age'

这是第一种方法,使用 $ 符号来 access 这个变量
值得注意的是,mean(Age) 仍然报错,是因为我们只是 access “Age”
它还没有在 memory 中
另一种方法是把数据 attach 到 memory 中

1
2
3
4
5
6
> attach(LungCapData)
> Age[1:5]
[1] 6 18 16 14 5
> detach(LungCapData)
> Age
错误: 找不到对象'Age'

当我们 attach LungCapData 后,memory 里就有了 LungCapData 对象
此时当我们直接输入 Age 时,就可以 access 它了
同时,也可以使用 detach 语句来清除 memory 中的 LungCapData

使用 class() 语句可以看该数据是什么类型的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> class(LungCapData)
[1] "data.frame"
> class(LungCap)
[1] "numeric"
> class(Age)
[1] "integer"
> class(Height)
[1] "numeric"
> class(Smoke)
[1] "factor"
> class(Gender)
[1] "factor"
> class(Caesarean)
[1] "factor"

如上面的代码,有 numeric, integer, factor … 类型的数据
对于 factor 类型的数据来说,可以使用 level() 语句来看它不同的值

1
2
3
4
> levels(Smoke)
[1] "no" "yes"
> levels(Gender)
[1] "female" "male"

summary() 语句可以给出 data set 的 summary
如 mean, median, max 等基本信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> summary(LungCapData)
LungCap Age Height Smoke Gender Caesarean
Min. : 0.507 Min. : 3.00 Min. :45.30 no :648 female:358 no :561
1st Qu.: 6.150 1st Qu.: 9.00 1st Qu.:59.90 yes: 77 male :367 yes:164
Median : 8.000 Median :13.00 Median :65.40
Mean : 7.863 Mean :12.33 Mean :64.84
3rd Qu.: 9.800 3rd Qu.:15.00 3rd Qu.:70.30
Max. :14.675 Max. :19.00 Max. :81.80
> x <- c(0,1,1,1,0,0,0,0,0,0)
> class(x)
[1] "numeric"
> summary(x)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 0.00 0.00 0.30 0.75 1.00

在上面的代码中,我们给 x 赋值,它是 numeric 的
如果我们想把它当作 factor 来处理,比如 0 代表 false,1 代表 true
可以使用 as.factor() 语句

1
2
3
4
5
6
> x <- as.factor(x)
> class(x)
[1] "factor"
> summary(x)
0 1
7 3

dim() & length() 给出了数据的 dimension 和长度

1
2
3
4
5
6
> dim(LungCapData)
[1] 725 6
> length(Age)
[1] 725
> length(Gender)
[1] 725

在 R 中,可以使用 double equal sign 来判断等式两边是否相等
Age[Gender==”male”] 只用来进行选择的,选择 male,再求 mean

1
2
3
4
5
6
7
8
9
10
11
> mean(Age[Gender=="male"])
[1] 12.20708
> FemData <- LungCapData[Gender=="female",]
> MaleData <- LungCapData[Gender=="male",]
> dim(FemData)
[1] 358 6
> dim(MaleData)
[1] 367 6
> summary(Gender)
female male
358 367

在上面的代码中,dim(FemData) 给出 358 个数据,dim(MaleData) 给出 367 个数据
这与 summary() 给出的信息是一致的

使用 & 进行多项条件的选择

1
2
3
> MaleOver15 <- LungCapData[Gender=="male" & Age > 15,]
> dim(MaleOver15)
[1] 89 6

使用 cbind() 语句来 combine 某一列数据和原始的表格

1
2
3
4
5
6
7
8
9
10
11
> FemSmoke <- Gender=="female" & Smoke=="yes"
> FemSmoke[1:5]
[1] FALSE TRUE FALSE FALSE FALSE
> MoreData <- cbind(LungCapData, FemSmoke)
> MoreData[1:5,]
LungCap Age Height Smoke Gender Caesarean FemSmoke
1 6.475 6 62.1 no male no FALSE
2 10.125 18 74.7 yes female no TRUE
3 9.550 16 69.7 no female yes FALSE
4 11.125 14 71.0 no male no FALSE
5 4.800 5 56.9 no male no FALSE

从上面的代码可以看出,表格的最后一列已经多了 FemSmoke 这个部分

最后,可以使用 rm() 语句来抹去 memory 中的变量
ls() 语句选中了所有的变量

1
> rm(list=ls())

此时,memory 中已经没有任何 variable 了

谢谢你请我吃糖果:)