1.2 對象
在R中,保存數據就是將數據存儲到R對象中。那么什么是對象呢?其實,它就是一個名稱而已,在R中存儲的數據就是一個R對象。比如,你可以將數據保存到像a或者b這樣的對象中。之后,R在遇到此類對象時,處理的其實是對象所保存的數據,如下所示。
a <-1 ?
a ?
## 1
a + 2 ?
## 3
? 要創建一個R對象,先確定一個名稱,然后使用賦值符號(小于號<后緊跟一個減號-)將數據賦值給它。這樣的符號組合<-看起來像一個向左的箭頭。R會生成一個具有該名稱的R對象,并將賦值符號后面的數值存儲在其中。
? 當你詢問R對象a里面是什么數據時,R會另起一行并告訴你答案。
? 為對象命名并賦值之后,就可以在新命令中使用該對象了。a的值為1,因此這里加2之后結果就變成了3。
下面就用die作為一個R對象的名稱,并且將1到6共6個整數存儲在這個對象中。要想查看一個R對象中存儲了什么內容,只需鍵入該對象的名稱并按回車鍵即可。
die <-1:6 die ## 1 2 3 4 5 6
創建了一個R對象之后,該對象會顯示在RStudio的環境面板上,如圖1-2所示。該面板內顯示了你在最近一次打開RStudio之后創建的所有R對象。

圖1-2:RStudio的環境面板可以用來跟蹤在當前會話中創建過的所有R對象
R對象的命名頗為自由,你基本上可以起你能想到的任何名稱,但還是要遵循一些規則。第一,對象名不能以數字開頭;第二,一些特殊的符號不能在名稱中出現,如^、!、$、@、+、-、/或者*。

R還區分大小寫,因此name和Name是兩個不同的對象。
Name <-1
name <-0
Name + 1
## 2
同一個對象如果再次被賦值的話,R會自動覆蓋存儲在對象中的信息,而不會請求你的批準。因此,不同的R對象最好不要使用相同的對象名,以免產生混淆。
my number <-1 my number ## 1 my number <-999 my number ## 999
如果你想查看一下已經命名了哪些R對象,可以使用ls命令。
ls() ## "a" "die" "my number" "name" "Name"
當然,你也可以通過RStudio的環境面板一目了然地看到已經命名了的R對象及其使用的對象名稱。
現在你的計算機內存中已經存儲了一個虛擬的骰子。你可以通過鍵入單詞die得到這個骰子的信息。那么你能用這個虛擬的骰子做些什么呢?有很多事情可以做。只要在命令行中出現了一個R對象的名稱,R在執行命令時處理的就會是該對象所存儲的數據。因此,舉例來說,這里的虛擬骰子可以用來做很多算術運算。雖然說擲骰子和算術運算是兩碼事,但是玩轉數字集應該是數據科學家的看家本領。因此,讓我們來看看到底怎么玩。
die -1 ## 0 1 2 3 4 5 die / 2 ## 0.5 1.0 1.5 2.0 2.5 3.0 die * die ## 1 4 9 16 25 36
如果你是線性代數的鐵桿粉絲(誰不是呢?),可能會注意到R并非始終遵循矩陣乘法的規則。相反,R使用元素方式執行(element-wise execution)。當你對一個數字集執行操作時,R會將相同的運算應用于該數字集中的每個元素。比如說,運行die -1時,R會從die的每個元素中減去1。
如果在一個運算中涉及兩個或者兩個以上的向量,R會將這些向量排成一行并執行一系列單獨的運算。例如,當運行die * die時,R會將兩個die向量排成一行,然后將向量1的第一個元素與向量2的第一個元素相乘。R接著會將向量1的第二個元素與向量2的第二個元素相乘,以此類推,直到每個元素都已相乘。結果會產生一個與前兩個向量長度相同的新向量,如圖1-3所示。

圖1-3:當R使用元素方式執行時,會匹配向量,然后獨立操作每對元素
如果兩個向量的長度不相等,R會在較短的向量上重復,直到其長度與較長向量相同,然后再執行運算,如圖1-4所示。但是這不會對短向量本身產生任何實質性的影響,在運算之后,短向量的長度不會發生改變。如果長向量的長度值不是短向量長度值的整數倍,R在返回運算結果的同時也會返回一條警告消息。R的這種行為稱為向量循環,可幫助R執行元素方式運算。
1:2 ## 1 2 1:4 ## 1 2 3 4 die ## 1 2 3 4 5 6 die + 1:2 ## 2 4 4 6 6 8 die + 1:4 ## 2 4 6 8 6 8 Warning message: In die + 1:4 : longer object length is not a multiple of shorter object length

圖1-4:對于兩個不等長的向量,R會重復較短的向量以執行元素方式運算
元素方式運算是R中一個非常有用的功能,因為這些運算以有序方式操作值組。當你開始處理數據集時,元素方式運算可以確保來自某個觀測或案例的值僅與來自相同觀測或案例的值配對。元素方式運算也降低了R程序和R函數的編寫難度。
但這并不意味著R擯棄了傳統的矩陣乘法。只是你需要使用矩陣乘法時,必須作出請求。你可以使用%*%運算符執行內乘法,使用%o%運算符執行外乘法。
die %*% die ## [,1] ## [1, ] 91 die %o% die ## [,1] [,2] [,3] [,4] [,5] [,6] ## [1, ] 1 2 3 4 5 6 ## [2, ] 2 4 6 8 10 12 ## [3, ] 3 6 9 12 15 18 ## [4, ] 4 8 12 16 20 24 ## [5, ] 5 10 15 20 25 30 ## [6, ] 6 12 18 24 30 36
你還可以用t命令執行矩陣轉置等運算,并用det命令獲取矩陣的行列式。
即便你不熟悉這些運算也沒有關系,因為需要時可以利用R強大的幫助系統快速地找到所需的函數。而且本書接下來的內容也不會涉及矩陣運算。
現在,我們已經可以用die對象進行運算了,接下來研究一下怎么把這個骰子“擲”起來?!皵S骰子”遠比基本的算術運算復雜,你要在骰子所有面的值中隨機地選擇一個。為此,我們需要一個函數(function)。
- Visual Basic .NET程序設計(第3版)
- Reporting with Visual Studio and Crystal Reports
- Android Development with Kotlin
- 三維圖形化C++趣味編程
- Java Web應用開發技術與案例教程(第2版)
- C#程序設計基礎:教程、實驗、習題
- 深入淺出PostgreSQL
- Apache Kafka Quick Start Guide
- Arduino可穿戴設備開發
- Managing Microsoft Hybrid Clouds
- Mockito Essentials
- Mastering PowerCLI
- AutoCAD基礎教程
- Isomorphic Go
- 青少年Python趣味編程