前言:
R代码也可以在Console下方的 ">" 之后运行,适用于输出简单的运算结果以及了解数据的大致信息(例如表单含有的行数、列数,最大值最小值等,在后面的详细案例中会做出介绍)
Console中运行的代码不会保存。
1. 基础运算符
2 + 2 # addition
4 - 2 # subtraction
4 * 4 # multiplication
8 / 2 # division
4 ^ 2 # exponentiation
5 %% 2 # modulo
2. 变量赋值
赋值符号:
与其他编程语言不同,R中的赋值符号不再是 “=”,而是 "<-
",在使用时需注意。
举例:
假如我有五支镜头,定义变量为```my_lens````,完整的赋值语句如下:
my_lens <- 5
注意变量名中不能包含空格,否则会报错:
常用的变量名定义方法有两种,一种是像本例中展示的那样,通过下划线连接,但是不能用减号,在R中减号只用于数学运算。另一种是采用第一个单词首字母小写,第二个单词首字母大写的方式区分变量名中的两个单词,例如myLens
。
3. 基础数据类型
要进行数据分析,了解数据集所包含的数据类型很重要,这会影响到我们能对现有数据进行何种操作。下面实际中常见的数据类型:
- numeric:类似余
3.2
这样的浮点数 - integer:浮点数去掉小数点,即整数
- logical:只有两种可能:
TRUE
orFALSE
。R中表示逻辑值时,字母要全部大写,python中则只需要首字母大写。 - character:表示字符串或文本,即引号内的内容。
大多数运算符都要求同种数据类型,如果类型不匹配,RStudio会报错“类型不匹配”:
因此在拿到数据集之后,检查数据类型尤为重要。这里用到了本教程的第一个函数:
class()
,用于检查数据类型,把需要检查数据类型的变量放在括号中,如图:
4. 第一种容器:向量(Vector)
在检查完变量的数据类型后,我们可以将同类型的值存放在向量中。
4.1 创建向量
需要使用c()
函数来连结括号内的元素,括号中可以填入多个元素或者变量名,但这些元素或者变量名必须拥有相同的类型,否则会出错。
在我手头的镜头中,有三支索尼,一支蔡司和一支腾龙,我们可以用向量来表示各种镜头的数量,并将这个向量命名为lens_nun
:
lens_num <- c(3, 1, 1)
这里有个很明显的不足,新定义的向量只包括了三种品牌镜头的数量,并没有品牌名称。我们可以借助names()
函数来实现向量内元素的命名,这个操作是我们的数据更直观。
4.2 元素命名
要想给lens_num
中的元素命名,我们得先准备另外一个向量lens_mark
,在lens_mark
中,元素数量必须等于被命名的元素数量。
lens_num <- c(3, 1, 1)
lens_mark <- c("sony", "zeiss", "tamron")
names(lens_num) <- lens_mark
现在输出lens_name
,看看命名后变化:
当然, 在赋值时,也可以直接使用一个向量,省去了定义元素名字的步骤:
names(lens_num) <- c("索尼", "蔡司", "腾龙")
lens_num
这里我用中文名字,以区分两种方法,结果如下:
4.3 向量数值运算
1.向量元素间的运算
如果有一天我变得很有钱,我会再买两支索尼镜头和一支蔡司镜头,然后卖掉腾龙镜头,将这一步定义为向量im_rich
:
im_rich <- c(2, 1, -1)
接下类只需要将lens_num
和新向量相加就能得到我有钱以后,手头的镜头种类和数量:
im_rich <- c(2, 1, -1)
lens_now <- lens_num + im_rich
lens_now
输出结果如下:
2. 向量求和
上一节介绍了两个向量各自元素之间的运算,这里我将介绍如何使用sum()
函数对向量进行求和运算。我想知道我现在一共有几支镜头,方法如下:
total_lens <- sum(lens_now)
total_lens
4.4 选择向量中的特定元素
如果我们只想选择向量中的一个元素,有两种方式,一种是使用该元素的索引,即第几个元素(R中,第一个元素的索引从1开始,而不是0).另一种是通过该元素的名字。
lens_now[1]
lens_now['sony']
如果我只想知道我有几只蔡司和几只腾龙镜头,即选择多个元素,需要借助向量。
lens_now[c(2,3)]
值得注意的是,中括号内的向量可以包含任意多的元素,元素之间用逗号隔开即可。当元素数量过多,且索引连续,可以将逗号替换为冒号:
a_vector[3: 11]
,这一步将选出a_vector
的第三个到第十一个元素。选多个元素同样可以借助元素名,使用时只需要将多个元素名放在同一个向量中:
lens_now[c("sony", "tamron")]
5.逻辑运算
< #小于
> #大于
<= #小于等于
>= #大于等于
== #等于
!= #不等于
逻辑运算输出的结果是比较结果,可以理解为是否符合某特定条件。若该条件满足,则输出TRUE
,反之,FALSE
。
现在我们对lens_now
做逻辑运算:
lens_now > 0
输出结果是向量各元素与0作比较的结果:
*注意:这一行代码输出了结果但是并不包含赋值语句,也就是说,我们可以将比较的结果赋值给另一个变量。
基于逻辑运算的这一特性,我们可以借助逻辑运算的结果进行更进一步的元素选择,即:将满足某条件的元素(比较结果为TRUE
)筛选出来,这一思路适用于所有选择元素的场景。向量中,根据某条件进行元素选择的代码如下:
all_lens <- lens_now[lens_now > 0]
all_lens
6. 矩阵
6.1 创建矩阵
矩阵与数组类似,都只能容纳拥有相同的数据类型的变量。二者区别在于,矩阵是二维的,包含行和列向量。
*作为二维容器,却只能存储同一种数据,比较鸡肋,第5章会讲到的data frame可以包含多种类型
创建矩阵需要matrix()
函数:
matrix(1:9, byrow = TRUE, nrow = 3)
在matrix()
函数中,我们用到 了3个arguments:
第一个arg 1:9表示我们使用的数据集是从1到9的自然数,
第二个arg byrow
表示元素的填充顺序,若为TRUE
,则逐行填充,填完第一行的三个元素再开始填充第二行,若为FALSE
,则为逐列填充。
matrix(1:9, byrow = FALSE, nrow = 3)
第三个arg为行数,我们设置为3行,不需要设置列数,因为9个元素平均分成三行,必然有3列。
6.2 矩阵命名
矩阵的命名包含行和列的命名,语法与向量元素命名类似,分别使用rownames()
函数和colnames()
函数。
这里我们以星球大战电影票房为例,数据集为三部星战电影在美国和美国以外其他国家的票房数据。每部电影的票房都以向量的形式给出。代码如下:
# 三部电影票房
new_hope <- c(461, 314)
empire_strikes <- c(290, 247)
return_jedi <- c(309, 155)
# 创建矩阵
star_war_matrix <- matrix(
c(new_hope, empire_strikes, return_jedi),
byrow = TRUE,
nrow = 3
)
# 用于命名的矩阵
region <- c("USA", "non-USA")
title <- c("A New Hope", "The Empire Strikes Back", "Return of the Jedi")
# 命名行
rownames(star_war_matrix) <- title
# 命名列
colnames(star_war_matrix) <- region
# print it out!
star_war_matrix
6.3 矩阵求和
一个很重要的数据分析思维:行和列两个维度能告诉我们哪些有价值的信息?
在本例中,每一行表示一部电影,那么对每行求和,就能得到每部电影的总票房,使用rowSum()
函数。对每列求和,就能得到三部电影在美国和非美国地区的总票房,使用colSum()
函数。代码如下:
# 对每行求和
total_office_for_row <- rowSums(star_war_matrix)
total_office_for_row
# 对每列求和
total_office_for_column <- colSums(star_war_matrix)
total_office_for_column
6.4 矩阵中新增行或列
函数:
rbind()
:用于增加行
cbind()
:用于增加列
用法:
big_matrix <- cbind(matrix_1, matrix_2, vector_1, ... )
接下来,在原本的星战矩阵中加入一列,表示星战三部曲在两地的总票房:
all_wars_matrix <- cbind(star_war_matrix, total_office_for_row)
all_wars_matrix
6.5 选择矩阵元素
选择矩阵元素的方法和选择向量元素类似,也需要用到逗号(,
)和冒号(:
)
*注意这里的逗号用来分开行和列,逗号左边表示行,右边表示列。而冒号表示从第几行到第几行或者从第几列到第几列
- 选择第一行,第二列的那个元素:
my_matrix[1, 2]
- 选择第1,2,3行和第2,3,4列:
my_matrix[1:3, 2:4]
- 选择第一行的所有元素:
my_matrix[1, ]
- 选择第一列的所有元素:
my_matrix[ , 1]
6.6 矩阵运算
假设每张电影票的价格是5美元,那么我们可以通过简单的除法,通过票房数据得出每部电影在两个地区的观影人数。
visitors <- star_war_matrix / 5
visitors
7. data frame
内容较多,参见第五章
8. 列表list
list这个容器跟data frame有一个共同点:都可以容纳不同类型的数据。
使用list()
函数创建列表,arg可以填入不同类型的数据,这些数据组成列表的元素。
# 创建一个向量,包含从1到10,10个自然数
my_vec <- 1:10
# 创建一个矩阵,包含1到9,共3列
my_matrix <- matrix(1:9, ncol = 3)
# 创建一个df,选取mtcars的前10行(内置数据集,参见第五章)
my_df <- mtcars[1:10, ]
# 创建并打印列表
my_list <- list(my_vec, my_matrix, my_df)
my_list
*注意这里的两层中括号,表示列表中元素的索引
8.1 命名列表元素
方法和命名向量元素相同,使用names()
函数
names(my_list) <- c("vector", "matrix", "data frame")
my_list
8.2 筛选特定元素
在8.1 中提到,list中使用两层中括号表示索引,因此筛选数据时也需要两层中括号,而在向量元素筛选时,只需要一层即可。下面的操作需要结合这两点,因为my_list
中有一个元素就是向量,如果我们想从list中选出向量的第一个元素,那么我们需要筛选两次:
# 用索引选出list的第一个元素
my_list[[1]]
# 用名字选出list的第一个元素
my_list[["vector"]]
# 用名字和索引选出list的第一个元素的第一个元素
my_list[["vector"]][1]