3. R基礎(chǔ)知識(shí)

前言:

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ù)類型:

  1. numeric:類似余3.2這樣的浮點(diǎn)數(shù)
  2. integer:浮點(diǎn)數(shù)去掉小數(shù)點(diǎn)戳吝,即整數(shù)
  3. logical:只有兩種可能:TRUE or FALSE浩销。R中表示邏輯值時(shí),字母要全部大寫(xiě)骨坑,python中則只需要首字母大寫(xiě)撼嗓。
  4. character:表示字符串或文本柬采,即引號(hào)內(nèi)的內(nèi)容。

大多數(shù)運(yùn)算符都要求同種數(shù)據(jù)類型且警,如果類型不匹配粉捻,RStudio會(huì)報(bào)錯(cuò)“類型不匹配”:


數(shù)據(jù)類型不匹配

因此在拿到數(shù)據(jù)集之后,檢查數(shù)據(jù)類型尤為重要斑芜。這里用到了本教程的第一個(gè)函數(shù):
class()肩刃,用于檢查數(shù)據(jù)類型,把需要檢查數(shù)據(jù)類型的變量放在括號(hào)中杏头,如圖:

class函數(shù)的用法

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é)果如下:


I‘m rich now
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è)元素

如果我只想知道我有幾只蔡司和幾只騰龍鏡頭,即選擇多個(gè)元素琅攘,需要借助向量垮庐。

lens_now[c(2,3)]

選兩個(gè)元素

值得注意的是,中括號(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")]
用元素名選多個(gè)元素

5.邏輯運(yùn)算

<   #小于
>   #大于
<=  #小于等于
>=  #大于等于
==  #等于
!=  #不等于

邏輯運(yùn)算輸出的結(jié)果是比較結(jié)果,可以理解為是否符合某特定條件挟纱。若該條件滿足羞酗,則輸出TRUE,反之紊服,FALSE檀轨。
現(xiàn)在我們對(duì)lens_now做邏輯運(yùn)算:

lens_now > 0

輸出結(jié)果是向量各元素與0作比較的結(jié)果:

elementwise compare

*注意:這一行代碼輸出了結(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
鏡頭數(shù)量是否嚴(yán)格大于0

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) 
3*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) 
3*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
星戰(zhàn)票房矩陣

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
觀影人數(shù)

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]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炉峰,一起剝皮案震驚了整個(gè)濱河市畏妖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疼阔,老刑警劉巖戒劫,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異婆廊,居然都是意外死亡迅细,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)淘邻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茵典,“玉大人,你說(shuō)我怎么就攤上這事宾舅⊥嘲ⅲ” “怎么了彩倚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)扶平。 經(jīng)常有香客問(wèn)我帆离,道長(zhǎng),這世上最難降的妖魔是什么结澄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任哥谷,我火速辦了婚禮,結(jié)果婚禮上麻献,老公的妹妹穿的比我還像新娘们妥。我一直安慰自己,他們只是感情好赎瑰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布王悍。 她就那樣靜靜地躺著,像睡著了一般餐曼。 火紅的嫁衣襯著肌膚如雪压储。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天源譬,我揣著相機(jī)與錄音集惋,去河邊找鬼。 笑死踩娘,一個(gè)胖子當(dāng)著我的面吹牛刮刑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播养渴,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼雷绢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了理卑?” 一聲冷哼從身側(cè)響起翘紊,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎藐唠,沒(méi)想到半個(gè)月后帆疟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宇立,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年踪宠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妈嘹。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柳琢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情染厅,我是刑警寧澤痘绎,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站肖粮,受9級(jí)特大地震影響孤页,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涩馆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一行施、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魂那,春花似錦蛾号、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至活逆,卻和暖如春精刷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔗候。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工怒允, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锈遥。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓纫事,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親所灸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丽惶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容