3. R基础知识

前言:

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. 基础数据类型

要进行数据分析,了解数据集所包含的数据类型很重要,这会影响到我们能对现有数据进行何种操作。下面实际中常见的数据类型:

  1. numeric:类似余3.2这样的浮点数
  2. integer:浮点数去掉小数点,即整数
  3. logical:只有两种可能:TRUE or FALSE。R中表示逻辑值时,字母要全部大写,python中则只需要首字母大写。
  4. character:表示字符串或文本,即引号内的内容。

大多数运算符都要求同种数据类型,如果类型不匹配,RStudio会报错“类型不匹配”:


数据类型不匹配

因此在拿到数据集之后,检查数据类型尤为重要。这里用到了本教程的第一个函数:
class(),用于检查数据类型,把需要检查数据类型的变量放在括号中,如图:

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

输出结果如下:


I‘m rich 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作比较的结果:

elementwise compare

*注意:这一行代码输出了结果但是并不包含赋值语句,也就是说,我们可以将比较的结果赋值给另一个变量。

基于逻辑运算的这一特性,我们可以借助逻辑运算的结果进行更进一步的元素选择,即:将满足某条件的元素(比较结果为TRUE)筛选出来,这一思路适用于所有选择元素的场景。向量中,根据某条件进行元素选择的代码如下:

all_lens <- lens_now[lens_now > 0]
all_lens
镜头数量是否严格大于0

6. 矩阵

6.1 创建矩阵

矩阵与数组类似,都只能容纳拥有相同的数据类型的变量。二者区别在于,矩阵是二维的,包含行和列向量。
*作为二维容器,却只能存储同一种数据,比较鸡肋,第5章会讲到的data frame可以包含多种类型
创建矩阵需要matrix()函数:

matrix(1:9, byrow = TRUE, nrow = 3) 
3*3矩阵,逐行

matrix()函数中,我们用到 了3个arguments:
第一个arg 1:9表示我们使用的数据集是从1到9的自然数,
第二个arg byrow表示元素的填充顺序,若为TRUE,则逐行填充,填完第一行的三个元素再开始填充第二行,若为FALSE,则为逐列填充。

matrix(1:9, byrow = FALSE, nrow = 3) 
3*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]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容