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?
需要一些技巧(我会操作演示)和审美能力。





