前言:
R代碼也可以在Console下方的 ">" 之后運(yùn)行划滋,適用于輸出簡(jiǎn)單的運(yùn)算結(jié)果以及了解數(shù)據(jù)的大致信息(例如表單含有的行數(shù)、列數(shù)埃篓,最大值最小值等处坪,在后面的詳細(xì)案例中會(huì)做出介紹)
Console中運(yùn)行的代碼不會(huì)保存。
1. 基礎(chǔ)運(yùn)算符
2 + 2 # addition
4 - 2 # subtraction
4 * 4 # multiplication
8 / 2 # division
4 ^ 2 # exponentiation
5 %% 2 # modulo
2. 變量賦值
賦值符號(hào):
與其他編程語(yǔ)言不同架专,R中的賦值符號(hào)不再是 “=”同窘,而是 "<-
",在使用時(shí)需注意部脚。
舉例:
假如我有五支鏡頭想邦,定義變量為```my_lens````,完整的賦值語(yǔ)句如下:
my_lens <- 5
注意變量名中不能包含空格委刘,否則會(huì)報(bào)錯(cuò):
常用的變量名定義方法有兩種丧没,一種是像本例中展示的那樣,通過(guò)下劃線連接锡移,但是不能用減號(hào)呕童,在R中減號(hào)只用于數(shù)學(xué)運(yùn)算。另一種是采用第一個(gè)單詞首字母小寫(xiě)淆珊,第二個(gè)單詞首字母大寫(xiě)的方式區(qū)分變量名中的兩個(gè)單詞夺饲,例如myLens
。
3. 基礎(chǔ)數(shù)據(jù)類型
要進(jìn)行數(shù)據(jù)分析施符,了解數(shù)據(jù)集所包含的數(shù)據(jù)類型很重要往声,這會(huì)影響到我們能對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行何種操作。下面實(shí)際中常見(jiàn)的數(shù)據(jù)類型:
- numeric:類似余
3.2
這樣的浮點(diǎn)數(shù) - integer:浮點(diǎn)數(shù)去掉小數(shù)點(diǎn)戳吝,即整數(shù)
- logical:只有兩種可能:
TRUE
orFALSE
浩销。R中表示邏輯值時(shí),字母要全部大寫(xiě)骨坑,python中則只需要首字母大寫(xiě)撼嗓。 - character:表示字符串或文本柬采,即引號(hào)內(nèi)的內(nèi)容。
大多數(shù)運(yùn)算符都要求同種數(shù)據(jù)類型且警,如果類型不匹配粉捻,RStudio會(huì)報(bào)錯(cuò)“類型不匹配”:
因此在拿到數(shù)據(jù)集之后,檢查數(shù)據(jù)類型尤為重要斑芜。這里用到了本教程的第一個(gè)函數(shù):
class()
肩刃,用于檢查數(shù)據(jù)類型,把需要檢查數(shù)據(jù)類型的變量放在括號(hào)中杏头,如圖:
4. 第一種容器:向量(Vector)
在檢查完變量的數(shù)據(jù)類型后盈包,我們可以將同類型的值存放在向量中。
4.1 創(chuàng)建向量
需要使用c()
函數(shù)來(lái)連結(jié)括號(hào)內(nèi)的元素醇王,括號(hào)中可以填入多個(gè)元素或者變量名呢燥,但這些元素或者變量名必須擁有相同的類型,否則會(huì)出錯(cuò)寓娩。
在我手頭的鏡頭中叛氨,有三支索尼,一支蔡司和一支騰龍棘伴,我們可以用向量來(lái)表示各種鏡頭的數(shù)量寞埠,并將這個(gè)向量命名為lens_nun
:
lens_num <- c(3, 1, 1)
這里有個(gè)很明顯的不足,新定義的向量只包括了三種品牌鏡頭的數(shù)量焊夸,并沒(méi)有品牌名稱仁连。我們可以借助names()
函數(shù)來(lái)實(shí)現(xiàn)向量?jī)?nèi)元素的命名,這個(gè)操作是我們的數(shù)據(jù)更直觀阱穗。
4.2 元素命名
要想給lens_num
中的元素命名饭冬,我們得先準(zhǔn)備另外一個(gè)向量lens_mark
,在lens_mark
中揪阶,元素?cái)?shù)量必須等于被命名的元素?cái)?shù)量伍伤。
lens_num <- c(3, 1, 1)
lens_mark <- c("sony", "zeiss", "tamron")
names(lens_num) <- lens_mark
現(xiàn)在輸出lens_name
,看看命名后變化:
當(dāng)然遣钳, 在賦值時(shí)扰魂,也可以直接使用一個(gè)向量,省去了定義元素名字的步驟:
names(lens_num) <- c("索尼", "蔡司", "騰龍")
lens_num
這里我用中文名字蕴茴,以區(qū)分兩種方法劝评,結(jié)果如下:
4.3 向量數(shù)值運(yùn)算
1.向量元素間的運(yùn)算
如果有一天我變得很有錢(qián),我會(huì)再買(mǎi)兩支索尼鏡頭和一支蔡司鏡頭倦淀,然后賣(mài)掉騰龍鏡頭蒋畜,將這一步定義為向量im_rich
:
im_rich <- c(2, 1, -1)
接下類只需要將lens_num
和新向量相加就能得到我有錢(qián)以后,手頭的鏡頭種類和數(shù)量:
im_rich <- c(2, 1, -1)
lens_now <- lens_num + im_rich
lens_now
輸出結(jié)果如下:
2. 向量求和
上一節(jié)介紹了兩個(gè)向量各自元素之間的運(yùn)算撞叽,這里我將介紹如何使用sum()
函數(shù)對(duì)向量進(jìn)行求和運(yùn)算姻成。我想知道我現(xiàn)在一共有幾支鏡頭插龄,方法如下:
total_lens <- sum(lens_now)
total_lens
4.4 選擇向量中的特定元素
如果我們只想選擇向量中的一個(gè)元素,有兩種方式科展,一種是使用該元素的索引均牢,即第幾個(gè)元素(R中,第一個(gè)元素的索引從1開(kāi)始才睹,而不是0).另一種是通過(guò)該元素的名字徘跪。
lens_now[1]
lens_now['sony']
如果我只想知道我有幾只蔡司和幾只騰龍鏡頭,即選擇多個(gè)元素琅攘,需要借助向量垮庐。
lens_now[c(2,3)]
值得注意的是,中括號(hào)內(nèi)的向量可以包含任意多的元素坞琴,元素之間用逗號(hào)隔開(kāi)即可哨查。當(dāng)元素?cái)?shù)量過(guò)多,且索引連續(xù)剧辐,可以將逗號(hào)替換為冒號(hào):
a_vector[3: 11]
解恰,這一步將選出a_vector
的第三個(gè)到第十一個(gè)元素。選多個(gè)元素同樣可以借助元素名浙于,使用時(shí)只需要將多個(gè)元素名放在同一個(gè)向量中:
lens_now[c("sony", "tamron")]
5.邏輯運(yùn)算
< #小于
> #大于
<= #小于等于
>= #大于等于
== #等于
!= #不等于
邏輯運(yùn)算輸出的結(jié)果是比較結(jié)果,可以理解為是否符合某特定條件挟纱。若該條件滿足羞酗,則輸出TRUE
,反之紊服,FALSE
檀轨。
現(xiàn)在我們對(duì)lens_now
做邏輯運(yùn)算:
lens_now > 0
輸出結(jié)果是向量各元素與0作比較的結(jié)果:
*注意:這一行代碼輸出了結(jié)果但是并不包含賦值語(yǔ)句,也就是說(shuō)欺嗤,我們可以將比較的結(jié)果賦值給另一個(gè)變量参萄。
基于邏輯運(yùn)算的這一特性,我們可以借助邏輯運(yùn)算的結(jié)果進(jìn)行更進(jìn)一步的元素選擇煎饼,即:將滿足某條件的元素(比較結(jié)果為TRUE
)篩選出來(lái)讹挎,這一思路適用于所有選擇元素的場(chǎng)景。向量中吆玖,根據(jù)某條件進(jìn)行元素選擇的代碼如下:
all_lens <- lens_now[lens_now > 0]
all_lens
6. 矩陣
6.1 創(chuàng)建矩陣
矩陣與數(shù)組類似筒溃,都只能容納擁有相同的數(shù)據(jù)類型的變量。二者區(qū)別在于沾乘,矩陣是二維的怜奖,包含行和列向量。
*作為二維容器翅阵,卻只能存儲(chǔ)同一種數(shù)據(jù)歪玲,比較雞肋迁央,第5章會(huì)講到的data frame可以包含多種類型
創(chuàng)建矩陣需要matrix()
函數(shù):
matrix(1:9, byrow = TRUE, nrow = 3)
在matrix()
函數(shù)中滥崩,我們用到 了3個(gè)arguments:
第一個(gè)arg 1:9表示我們使用的數(shù)據(jù)集是從1到9的自然數(shù)岖圈,
第二個(gè)arg byrow
表示元素的填充順序,若為TRUE
夭委,則逐行填充幅狮,填完第一行的三個(gè)元素再開(kāi)始填充第二行,若為FALSE
株灸,則為逐列填充崇摄。
matrix(1:9, byrow = FALSE, nrow = 3)
第三個(gè)arg為行數(shù)慌烧,我們?cè)O(shè)置為3行逐抑,不需要設(shè)置列數(shù),因?yàn)?個(gè)元素平均分成三行屹蚊,必然有3列厕氨。
6.2 矩陣命名
矩陣的命名包含行和列的命名,語(yǔ)法與向量元素命名類似汹粤,分別使用rownames()
函數(shù)和colnames()
函數(shù)命斧。
這里我們以星球大戰(zhàn)電影票房為例,數(shù)據(jù)集為三部星戰(zhàn)電影在美國(guó)和美國(guó)以外其他國(guó)家的票房數(shù)據(jù)嘱兼。每部電影的票房都以向量的形式給出国葬。代碼如下:
# 三部電影票房
new_hope <- c(461, 314)
empire_strikes <- c(290, 247)
return_jedi <- c(309, 155)
# 創(chuàng)建矩陣
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 矩陣求和
一個(gè)很重要的數(shù)據(jù)分析思維:行和列兩個(gè)維度能告訴我們哪些有價(jià)值的信息?
在本例中芹壕,每一行表示一部電影汇四,那么對(duì)每行求和,就能得到每部電影的總票房踢涌,使用rowSum()
函數(shù)通孽。對(duì)每列求和,就能得到三部電影在美國(guó)和非美國(guó)地區(qū)的總票房睁壁,使用colSum()
函數(shù)背苦。代碼如下:
# 對(duì)每行求和
total_office_for_row <- rowSums(star_war_matrix)
total_office_for_row
# 對(duì)每列求和
total_office_for_column <- colSums(star_war_matrix)
total_office_for_column
6.4 矩陣中新增行或列
函數(shù):
rbind()
:用于增加行
cbind()
:用于增加列
用法:
big_matrix <- cbind(matrix_1, matrix_2, vector_1, ... )
接下來(lái),在原本的星戰(zhàn)矩陣中加入一列潘明,表示星戰(zhàn)三部曲在兩地的總票房:
all_wars_matrix <- cbind(star_war_matrix, total_office_for_row)
all_wars_matrix
6.5 選擇矩陣元素
選擇矩陣元素的方法和選擇向量元素類似糠惫,也需要用到逗號(hào)(,
)和冒號(hào)(:
)
*注意這里的逗號(hào)用來(lái)分開(kāi)行和列,逗號(hào)左邊表示行钉疫,右邊表示列硼讽。而冒號(hào)表示從第幾行到第幾行或者從第幾列到第幾列
- 選擇第一行,第二列的那個(gè)元素:
my_matrix[1, 2]
- 選擇第1牲阁,2固阁,3行和第2壤躲,3,4列:
my_matrix[1:3, 2:4]
- 選擇第一行的所有元素:
my_matrix[1, ]
- 選擇第一列的所有元素:
my_matrix[ , 1]
6.6 矩陣運(yùn)算
假設(shè)每張電影票的價(jià)格是5美元备燃,那么我們可以通過(guò)簡(jiǎn)單的除法碉克,通過(guò)票房數(shù)據(jù)得出每部電影在兩個(gè)地區(qū)的觀影人數(shù)。
visitors <- star_war_matrix / 5
visitors
7. data frame
內(nèi)容較多并齐,參見(jiàn)第五章
8. 列表list
list這個(gè)容器跟data frame有一個(gè)共同點(diǎn):都可以容納不同類型的數(shù)據(jù)漏麦。
使用list()
函數(shù)創(chuàng)建列表,arg可以填入不同類型的數(shù)據(jù)况褪,這些數(shù)據(jù)組成列表的元素撕贞。
# 創(chuàng)建一個(gè)向量刀崖,包含從1到10板鬓,10個(gè)自然數(shù)
my_vec <- 1:10
# 創(chuàng)建一個(gè)矩陣偶洋,包含1到9哟绊,共3列
my_matrix <- matrix(1:9, ncol = 3)
# 創(chuàng)建一個(gè)df,選取mtcars的前10行(內(nèi)置數(shù)據(jù)集爱谁,參見(jiàn)第五章)
my_df <- mtcars[1:10, ]
# 創(chuàng)建并打印列表
my_list <- list(my_vec, my_matrix, my_df)
my_list
*注意這里的兩層中括號(hào)绕娘,表示列表中元素的索引
8.1 命名列表元素
方法和命名向量元素相同青扔,使用names()
函數(shù)
names(my_list) <- c("vector", "matrix", "data frame")
my_list
8.2 篩選特定元素
在8.1 中提到锯七,list中使用兩層中括號(hào)表示索引链快,因此篩選數(shù)據(jù)時(shí)也需要兩層中括號(hào),而在向量元素篩選時(shí)眉尸,只需要一層即可域蜗。下面的操作需要結(jié)合這兩點(diǎn),因?yàn)?code>my_list中有一個(gè)元素就是向量效五,如果我們想從list中選出向量的第一個(gè)元素,那么我們需要篩選兩次:
# 用索引選出list的第一個(gè)元素
my_list[[1]]
# 用名字選出list的第一個(gè)元素
my_list[["vector"]]
# 用名字和索引選出list的第一個(gè)元素的第一個(gè)元素
my_list[["vector"]][1]