《R語言入門與實踐》學習筆記三
第三課任務:
完成專案玩撲克牌前1/2,並通過專案學會以下技能:
1)儲存新的資料型別,比如字串和邏輯值。
2)將資料集儲存為向量,矩陣,陣列,列表或者資料框型別。
3)用R載入或儲存下載的資料。
……………………………………………………………………
可以將該專案前1/2分成一個子任務:
1.建立一副牌。
……………………………………………………………………
-----------------------資料型別------------------------
3.1 原子型向量
R中大部分資料集都可以匯入,但是從建立一副牌學會R中儲存,拆解和組合資料。在R中,最簡單的物件型別叫作原子型向量(atomic vector)。比如說在作業一里的物件die<-1:6。有兩個常見函式可以對原子型向量進行操作:
判斷原子型向量:is.vector(die)##return TRUE/FALSE
返還原子型向量長度:length(die)##return int
每一個原子型向量都將其值儲存在其一維向量中,並且只能是一種型別的資料,R可以識別六種基本型別的原子型向量,分別是:雙整形(double),整形(integer),字元型(character),邏輯型(logical),複數整型(complex)以及原始型別(raw)。
檢視物件是什麼型別:typeof()
die<-1:6
typeof(die)##”double”
3.1.1 雙整形(double)
雙整形向量用來儲存普通的數值型資料。資料可正可負,可大可小,可包含小數部分,也可以不包含。總之,在R中隨便輸入一個數值都會預設以雙整形儲存。也可以將其稱為數值型。
3.1.2 整形(integer)
整形資料的數值不需要小數點部分,但是數值一般被儲存為雙整形(整形的儲存方式比雙整形更加精確,除非該數相當大或者相當小),所以在R中整型不太常見,明確的設定整形的方法是在數值之後加上大寫字母L:
int<-c(-1L,2L,3L)
typeof(int)##”integer”
3.1.3 字元型(character)
字元型向量儲存一小段文字,在R中,字元要加雙引號,再組合起來構成一個字元型向量。
3.1.4 邏輯型(logical)
邏輯型向量用來儲存TRUE和FALSE,這是R中布林資料的表現形式。只要在R中全部大寫TRUE(T)和FALSE(F)(不加雙引號),就會被當作邏輯型資料。
3>4##FALSE
logic<-c(TRUE,FALSE,TRUE)
logic ##TRUE FALSE TRUE
3.1.5 複數型別(complex)和原始型別(raw)
複數型別用來儲存複數。要生成一個複數型別向量,只需要將某個數字與帶i的虛數項相加即可。
comp<-c(1+1i,1+2i,1+3i)
comp
##1+1i 1+2i 1+3i
原始型別向量用來儲存資料的原始位元組,如果要生成一個長度為n的空原始型別向量,可以用raw(n)。
raw(3)
##00 00 00
-----------------------資料集------------------------
3.2 屬性
屬性是附加給原子型向量的額外資訊,可以將屬性賦予一個原子型向量(或者任意一個R物件)。可以把屬性理解為物件的元資料,它的作用是將與這個物件相關的資訊以一種便捷的方式存起來並附加給該物件。
檢視物件包含那些屬性資訊:attributes(die)##NULL。
3.2.1 名稱屬性
一個原子型向量最常見的三種屬性是:名字(name),維度(dim)和類(class)。
查詢物件的名稱屬性:names(die)##NULL
返回值為NULL表明die沒有物件的名稱屬性。利用輔助函式,可以將一串字元向量賦給die物件,作為它的名稱屬性。這個字元向量的長度應該與die等長,每個字元元素都對應die中相應位置的元素名稱。
names(die)<-c(“one”,”two”,”three”,”four”,”five”,”six”)
現在,die就有了名稱屬性:
names(die)
##”one” ”two” ”three” ”four” ”five” ”six”
attributes(die)
##$names
##[1] “one” ”two” ”three” ”four” ”five” ”six”
die
##one two three four five six
##1 2 3 4 5 6
要想一次性刪除名稱屬性值,需要將NULL賦給names函式。
names(die)<-NULL
die
##1 2 3 4 5 6
3.2.2 維度屬性
原子型向量可以轉換為一個n維陣列,方法是用dim函式將相應的維度屬性賦給該向量。
dim(die)<-c(2,3)
die
## [,1] [,2] [,3]
##[1,] 1 3 5
##[2,] 2 4 6
dim(die)<-c(3,2)
die
## [,1] [,2]
##[1,] 1 4
##[2,] 2 5
##[3,] 3 6
在分配維度屬性的時候,R始終將第一個值賦給行數,將第二個值賦給列數。R對行列進行維度操縱時,行的優先權要高於列。如果想人為控制排列過程,可以使用輔助函式matrix或array。
3.3 矩陣
在R中矩陣的概念與線性代數中矩陣的概念一樣。想要生成一個矩陣,首先將一個原子型向量交給函式matrix,然後使用引數nrow定義該矩陣的行數,ncol定義該矩陣的列數,預設排列方式按照列優先進行,可以設定byrow=TRUE將排列方式改為行優先。
3.4 陣列
array用來生成一個n維陣列。
3.5 類
常見的型別包括雙整形(double),整形(integer),字元型(character),邏輯型(logical),複數整型(complex)以及原始型別(raw)。更改物件的維度並不會改變其型別,但是會改變這個物件的class屬性。
dim(die)<-c(2,3)
typeof(die)
##”double”
class(die)
##”matrix”
3.5.1 日期與時間
除了六種普通型別外,R的屬性系統還能表示更多的資料型別,比如R用類POSIXct和POSIXt表示日期和時間資料。執行Sys.time()檢視計算機當前時間。
now<-Sys.time()
now
##”2014-03-17 12:00:00 UTC”
typeof(now)
##”double”
class(now)
##”POSIXct” “POSIXt”
POSIXct是一個被廣泛用於表示日期與時間的框架,時間被表示為自1970年1月1日零點(UTC時間)開始逝去的秒數。可以將時間物件now的class屬性移除,或者使用unclass函式也可以達到同樣的效果。
class(now)<-NULL
或者
unclass(now)
##135555643
3.5.2 因子
因子在R中用來儲存分類資訊,因子只可以取某些特定的值,而這些值之間可能有一些特殊的順序規律。
向factor函式傳遞一個原子型向量即可生成一個因子。R在顯示因子資訊時使用了它的levels屬性,每一個1代表female,也就是levels中的第一個標籤,每一個2都顯示male,也就是第二個標籤。如果這個因子還有數值3的話,還會顯示第三個標籤,以此類推。
因子的存在,使得在統計模型中加入分類變數變得更加簡單,因為這些分類變數已經被編碼成一些數值,但是,因子容易使人產生困惑,因為它看起來想字串,但是表現為整數值。
在載入或者生成資料時,R會嘗試將字串變數轉換為因子型。但是除非需要,否則儘量禁止R這樣做。
將一個因子強制轉換為字串:as.character()
如果嘗試把不同型別的資料都塞進一個向量,R會將它們全部鑽轉換成同一種類型的資料。包括矩陣和陣列都是特殊的原子型向量,它們都只能儲存在單一型別的資料。
3.6 強制轉換
如果一個原子型向量包含字串,R會將該向量中的所有元素都轉換成字元型,如果一個原子型向量只包含邏輯型和數值型元素,R會將邏輯型全部轉換為數值型。
強制型別轉換函式:as.character(1)
##”1”
as.logical(1)
##TRUE
as.numeric(FALSE)
##0
3.7 列表
列表將資料組織在一個一維集合中,它不是某些具體的值組織起來,而是組織R物件,如原子型向量和其他列表。
3.8 資料框
資料框將向量組織在一個二維表格之中,每一個向量都是這個表格中的一列,因此資料框的每一列都可以用來儲存一種型別的資料,列與列之間的資料型別可以不同,但是每一列中的所有元素都必須是同一種類型的資料。
手動建立資料框:
df<-data.frame(face=c(“ace”,”two”,”six”),suit=c(“clubs”,”clubs”,”clubs”),value=c(1,2,3))
df
##face suit value
## ace clubs 1
##two clubs 2
##six clubs 3
-----------------------------注-------------------------------
1.本學習記錄來自Garrett Grolemund先生所著《Hands-On Programming with R》(中文名R語言入門與實踐)一書。
2.本專案所用deck資料框資料太多,可以從檔案deck.csv中載入,下載地址為https://gist.github.com/garrettgman/9629323(需要翻牆)。單擊Download Zip下載即可。下載之後在RStudio中單擊Import Dataset->From text file匯入。
3.想要更改儲存路徑,可以通過訪問Rstudio選單欄中的Session>Set WorkingDirectory>Choose Directory進行更改。
4. 21點(Blackjack)由2到6個人玩,使用除大小王之外的52張牌,遊戲者的目標是使手中的牌的點數之和不超過21點且儘量大。