Chapter 1 R的基础知识
1.1 科学计算器
四则运算:
(1 + 2 * 4)/3 - 1.3# [1] 1.7
指数运算: 例如,100的0.5次方:
100^0.5# [1] 10
对数运算:
log(2)# [1] 0.6931472
注意这是自然对数,与excel里的表述不一样。若以10为底,需明确标注:
log10(2) # [1] 0.30103
类似地,以2为底的对数是:
log2(2)## [1] 1
特殊的常数: e是自然对数的底,e=2.718…, exp(1) = e^1;用于指数函数
exp(1)## [1] 2.718282
pi = 3.14159…圆周率
sin(pi/2)## [1] 1
科学计数法,6.22*10^23,注意这里e不是自然对数的底
6.22e23## [1] 6.22e+23
绝对值
abs(-10) ## [1] 10
1.1.1 取整
round()函数取整原则:四舍六入五成双
round(2.3)## [1] 2
round(2.6)## [1] 3
round(2.5)## [1] 2
round(3.5)## [1] 4
floor(2.6) #向下取整## [1] 2
ceiling(2.3) #向上取整## [1] 3
trunc(2.3)#取整数部分## [1] 2
trunc(2.6)## [1] 2
1.1.2 保留有效数字
原则:四舍六入五成双
round(pi, 2) #保留2位小数## [1] 3.14
round(pi, 3) #保留3位小数## [1] 3.142
signif(pi,2) #保留2位有效数字## [1] 3.1
signif(pi,3) #保留3位有效数字## [1] 3.14
1.2 变量赋值
在R语言里,用符号”<-”给变量赋值。它的功能和”=”几乎等同。但是用<-是一种传统,我们最好遵守。
x1 = 12
x1## [1] 12
x2 <- 23
x2## [1] 23
y <- x1 + x2
y## [1] 35
x1 + x2 -> z
z## [1] 35
1.3 变量取名规则
变量名只能是字母、数字、点(
.)、下划线(_)的组合只能以字母或点开头;不能以数字、下划线开头
对字母大小写敏感,
a和A是不同的变量变量名不能含有空格:
x_1,x.1都可以,但x 1不可以;推荐x_1形式的命名,理由是方便阅读,方便记忆
1.4 变量类型
| 变量 | 含义 |
|---|---|
| integer | 整数 |
| numeric | 实数 |
| character | 字符 |
| logical | 逻辑值(TRUE或FALSE) |
class(as.integer(1.2)) #将1.2转化为整数,并查看其类型## [1] "integer"
class(pi) # pi = 3.1415......## [1] "numeric"
class("Xiamen")## [1] "character"
class(c(TRUE,FALSE))## [1] "logical"
1.5 常用的数据类型
| 数据类型 | 说明 |
|---|---|
| vector | 向量,元素可以是数值、字符串、逻辑值 |
| factor | 因子,水平,是离散的,以整数vector形式储存,映射到字符串上 |
| matrix | 矩阵,所有元素的类型(numeric, character等)需一致 |
| data frame | 数据表,和matrix类似,但每列的类型可以不一致 |
| list | 清单,与vector类似,但每个元素的类型可以不一致,且可以是任何数据类型(例如numeric,data frame, list…) |
1.6 数据类型强制转化(coercing)
t_1 <- c("1", "2", "3.4") #字符,无法进行计算
t_1## [1] "1" "2" "3.4"
class(t_1)## [1] "character"
t_2 <- as.numeric(t_1) #转化为数值,就可以计算了
t_2## [1] 1.0 2.0 3.4
class(t_2)## [1] "numeric"
t_3 <- as.factor(t_2) #数值转化为因子,非常有用的功能,以后详述
t_3## [1] 1 2 3.4
## Levels: 1 2 3.4
class(t_3)## [1] "factor"
1.7 缺失值(NA)和无穷大(Inf)
实验数据经常会有缺失值,缺失值的处理对于数据分析非常重要。
v0 <- c(1, 3, 4, NA) #第4个数缺失
v0## [1] 1 3 4 NA
is.na(v0) #判断是否有缺失值## [1] FALSE FALSE FALSE TRUE
v0[is.na(v0)] <- 0 #将缺失值替换为0
v0## [1] 1 3 4 0
logv0 <- log(v0) #对数据进行自然对数转化,产生了负无穷大值(-Inf)
logv0## [1] 0.000000 1.098612 1.386294 -Inf
is.infinite(logv0) # 检查是否有无穷大,包括Inf和-Inf## [1] FALSE FALSE FALSE TRUE
logv0[is.infinite(logv0)] <- NA #将无穷大替换为缺失值NA
logv0## [1] 0.000000 1.098612 1.386294 NA
1.8 向量(vector)
1.8.1 用函数c( )生成向量
“c”的含义: 1. combine
2. concatenate [kɒn’kætɪneɪt] vt.把 (一系列事件、事情等)联系起来
- 数值向量
v1 <- c(1.4, 3, 10.9, -7)
v1## [1] 1.4 3.0 10.9 -7.0
- 字符向量
v2 <- c("apple","organge","banana")
v2## [1] "apple" "organge" "banana"
- 逻辑值向量
v3 <- c(TRUE,FALSE,TRUE,FALSE)
v3## [1] TRUE FALSE TRUE FALSE
1.8.2 用 seq()生成等差序列
seq(from = 10, to = 100, by = 10) ## [1] 10 20 30 40 50 60 70 80 90 100
from是第一个值,to是最后一个值,by是相邻两个数的间隔值。
可以简略成(默认第1个数赋给from,第2个数赋给to,第3个数赋给by) :
seq(10, 100, 10)## [1] 10 20 30 40 50 60 70 80 90 100
怎么使用seq()函数?–查看帮助信息。
执行代码?seq, 你会在Help栏看到如下信息:
Usage
seq(…)
Default S3 method:
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)), length.out = NULL, along.with = NULL, …)
耐心读一读,你可以看懂。读懂之后,你还可以这么使用seq():
seq(10, 100, length.out = 19)## [1] 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100
length.out是数列的长度
v2 <- seq(10, 100, length.out = 19)
v2[12]## [1] 65
1.8.3 用:符号生成连续自然数序列
1:10## [1] 1 2 3 4 5 6 7 8 9 10
v3 <- 20:30
v3## [1] 20 21 22 23 24 25 26 27 28 29 30
1.8.4 用rep()重复元素,生成向量
rep(8, 5)## [1] 8 8 8 8 8
rep("ha", 6)## [1] "ha" "ha" "ha" "ha" "ha" "ha"
rep(1:3, 2)## [1] 1 2 3 1 2 3
rep(1:3, each = 3)## [1] 1 1 1 2 2 2 3 3 3
rep(1:3, each = 3, times=2)## [1] 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3
这个功能在自动填充数据表s时非常有用,例如,填充treatment,replicate编号。
1.8.5 向量信息提取与运算
v1 <- c(1.4, 3, 10.9, -7)
v1[3] # 引用第3个元素## [1] 10.9
v1 + 10 # 每个元素均加10## [1] 11.4 13.0 20.9 3.0
v1 * 10 # 每个元素均乘以10## [1] 14 30 109 -70
v1^2 #每个元素均求平方## [1] 1.96 9.00 118.81 49.00
1.8.6 针对向量的统计运算
v4 <- seq(60, 100, 5)
v4## [1] 60 65 70 75 80 85 90 95 100
summary(v4) ## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 60 70 80 80 90 100
mean(v4) #算术平均值## [1] 80
median(v4) #中位数## [1] 80
sd(v4) # 标准差## [1] 13.69306
min(v4) # 最小值## [1] 60
max(v4) # 最大值## [1] 100
range(v4) #范围:最小值~最大值## [1] 60 100
1.9 矩阵(matrix)
1.9.1 用matrix()函数生成一个矩阵
m1 <- matrix(1:18, nrow=3, ncol=6)
m1## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 4 7 10 13 16
## [2,] 2 5 8 11 14 17
## [3,] 3 6 9 12 15 18
默认按列排元素,可用byrow更改为按行排
m2 <- matrix(1:18, nrow=3, ncol=6, byrow=T)
m2## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 2 3 4 5 6
## [2,] 7 8 9 10 11 12
## [3,] 13 14 15 16 17 18
1.10 数据表(data frame)
1.10.1 用data.frame()函数生成一个数据表
数据表储存以下信息:学生姓名、性别、考试分数
student <- c("Tom", "Jack", "Mingming", "Alice", "Feifei")
sex <- c("Male", "Male", "Male", "Female", "Female")
score <- c(83, 72, 80, 92, 95)
data.frame(student, sex, score)## student sex score
## 1 Tom Male 83
## 2 Jack Male 72
## 3 Mingming Male 80
## 4 Alice Female 92
## 5 Feifei Female 95
可将该数据表储存于变量d1中,也可以说给数据表取个名字叫d1
d1 <- data.frame(student, sex, score)1.10.2 引用data.frame中的信息
引用d1数据表的student列有两种方法,一种是用名称,一种是用编号:
d1$student ## [1] "Tom" "Jack" "Mingming" "Alice" "Feifei"
d1[ , 1] #逗号前是行号,逗号后是列号## [1] "Tom" "Jack" "Mingming" "Alice" "Feifei"
引用d1数据表第2个学生的成绩有两种方法,一种是用名称,一种是用编号:
d1$score[2]## [1] 72
d1[2, 3] ## [1] 72
1.10.3 查看base R自带的数据
data() #用此函数查看R自带的数据,以下是节选。可以用这些数据来测试、交流你的统计、绘图代码。
| 数据名称 | 简介 |
|---|---|
| BOD | Biochemical Oxygen Demand |
| ChickWeight | Weight versus age of chicks on different |
| ToothGrowth | The Effect of Vitamin C on Tooth Growth in Guinea Pigs |
| co2 | Mauna Loa Atmospheric CO2 Concentration |
| iris | Edgar Anderson’s Iris Data |
| mtcars | Motor Trend Car Road Tests |
| npk | Classical N, P, K Factorial Experiment |
| precip | Annual Precipitation in US Cities |
| pressure | Vapor Pressure of Mercury as a Function of Temperature |
| rivers | Lengths of Major North American Rivers |
1.10.4 查看数据表的常用命令
- 查看数据
iris表头(默认前6行,可更改)
head(iris )## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
–
- 查看表尾(默认最后6行,可更改,此处改为4行)
tail(iris, 4)## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 147 6.3 2.5 5.0 1.9 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3.0 5.1 1.8 virginica
- 查看数据表有哪些变量
names(iris) ## [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
以上结果显示5个变量的名称,每1列是1个变量。
- 查看数据表的尺寸(dimension),即行数和列数
dim(iris) ## [1] 150 5
结果显示150行,5列。
length()显示数据表的列数,即变量数;显示vector的长度,即元素数。
length(iris) #5列## [1] 5
length(iris$Species) #150行## [1] 150
1.10.5 查看数据表的其他性质
- 查看数据表的结构
str(iris) ## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
前4列均为numeric,最后一列为factor
- 查看数据表的概要
summary(iris)## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
包含了每列的最小值、25%分位数、中位值、均值、75%分位数、最大值
- 查看
iris这个对象(object)的类型
class(iris) ## [1] "data.frame"
当然是data.frame类型。
1.10.6 合并数据表
d1## student sex score
## 1 Tom Male 83
## 2 Jack Male 72
## 3 Mingming Male 80
## 4 Alice Female 92
## 5 Feifei Female 95
d2 <- data.frame(age = c(20, 19, 20, 21, 19))
d2## age
## 1 20
## 2 19
## 3 20
## 4 21
## 5 19
- 合并列(
column binding)
cbind(d1, d2) ## student sex score age
## 1 Tom Male 83 20
## 2 Jack Male 72 19
## 3 Mingming Male 80 20
## 4 Alice Female 92 21
## 5 Feifei Female 95 19
- 合并行(
row binding)
rbind(d1, d1)## student sex score
## 1 Tom Male 83
## 2 Jack Male 72
## 3 Mingming Male 80
## 4 Alice Female 92
## 5 Feifei Female 95
## 6 Tom Male 83
## 7 Jack Male 72
## 8 Mingming Male 80
## 9 Alice Female 92
## 10 Feifei Female 95
1.11 读入数据
四种方法:
| 代码 | 说明 |
|---|---|
d1 <- read.table("clipboard", head = T) |
从剪贴板(ctrl+C)直接读取,适合于小数据表的快速操作 |
d2 <- read.csv(file.choose()) |
弹出对话框,点击鼠标选取文件,读取csv格式的数据 |
d3 <- read.csv("你的文件名.csv") |
从工作目录下直接读取csv格式的数据 |
d4 <- read_excel("你的文件名.xlsx", sheet = 1) |
直接读取xlsx文件中某个sheet(此处为sheet1)中的数据,需先加载readxl程序包 |
1.12 输出数据
co2是R自带的时间序列数据,此处将其转化为data.frame,用write.csv()函数将数据储存于名为“CO2_data.csv”的文件中。你可在工作文件夹下找到该文件。
d_CO2 <- data.frame(time = time(co2), CO2 = co2)
write.csv(d_CO2, "CO2_data.csv")1.14 ggplot作图
先对ggplot绘图有个简单印象,下次课我们深入学习。
library(ggplot2) #ggplot绘图
ggplot(d_CO2, aes(time, CO2))+
theme_bw()+
geom_line(color = "red2")+
labs(x = "Year",
y = ~pCO[2]~(ppm))## Don't know how to automatically pick scale for object of type ts. Defaulting to continuous.
## Don't know how to automatically pick scale for object of type ts. Defaulting to continuous.

#ggsave("pCO2.png", width=342/90, height=243/90, dpi=600)1.16 保存图片
1.16.1 第二种方法
由于我们以后大多使用ggplot()作图,因此可以用ggplot2程序包中的ggsave()函数保存当前显示的图片(在RStudio右下面板中)。
library(ggplot2)
ggplot(mpg, aes(displ, hwy))+
geom_point()
ggsave("myplot_2.png", width=359/90, height=239/90, dpi=600) #png格式,位图
ggsave("myplot_2.pdf", width=359/90, height=239/90) #pdf格式,矢量图完成以上操作,你就能在工作文件夹里找到名称为“myplot_2.png”“myplot_2.pdf”的图了。
如何设置合适的
width和height?
需要一些技巧(我会操作演示)和审美能力。





