天天看點

《R語言遊戲資料分析與挖掘》一2.2 資料對象

R擁有許多用于存儲資料的對象類型,包括向量、矩陣、數組、資料框和清單。它們在存儲資料的類型、建立方式、結構複雜度,以及用于定位和通路其中個别元素的标記等方面均有所不同。多樣化的資料對象賦予了R靈活處理資料的能力。

R中有許多資料類型用來存儲各種各樣的資料,包括數值型(numeric)、邏輯型(logical)、日期型(date)、字元型(character)、複數型(complex)、原味型(二進制形式儲存資料raw)。此外,也可能是預設值(NA)和空值(NULL)。其中最經常用到的4種類型是數值型、邏輯型、日期型和字元型。

對象中存儲的資料類型可以用mode()函數檢視。R中提供了一系列用來判斷某個對象的資料類型和将其轉換為另一種資料類型的函數,如表2-1所示。

《R語言遊戲資料分析與挖掘》一2.2 資料對象

R資料對象的另一個基本屬性是長度和類型屬性。可以用length()函數讀取對象的長度,通過mode()函數讀取對象的類型。

1.向量的建立

R語言最基本的資料對象是向量(vector),向量是以一維數組的方法管理資料。在大多數情況下都會使用長度大于1的向量,可以在R中使用c()函數(代表合并combine)和相應的參數來建立一個向量。向量的資料類型可以是字元型、邏輯值型(TRUE/T、FALSE/F)、數值型和複數型。一個向量的長度是它含有元素的數量,可以用length()函數來擷取。接下來,利用幾個小例子幫助大家了解。

一個向量的所有元素都必須屬于相同的模式。如果不是,R将強制執行類型轉換。例如:

從以上例子可知,當數值型與邏輯型向量合并時,R會将邏輯型轉化為數值型,TRUE轉換成1,FALSE轉換成0,此時的向量是數值型向量;當數值型或邏輯值與字元型合并時,R會将其值強制轉換成字元類型(數字和邏輯值元素都加上雙引号),變成字元型向量。

2.向量的運算

因為R語言是矢量化的語言,是以其最強大的方面之一就是函數的向量化。這意味着操作會自動應用于向量的每一個元素,而不需要周遊向量的每個元素。例如,建立一個向量w,元素由1~10的序列組成,要對向量w中的每個元素進行開方根,隻需要進行如下操作:

sqrt函數直接作用于w中的每個元素進行開方根,不需要通過對w中的每個元素進行循環的方式實作。

也可以利用R的這個特性進行向量的四則運算。

向量w1和w2中相同位置的元素會進行相加。例如,w1的第一個元素是2,w2的第一個元素是3.1,相加後,w的第一個元素就是2+3.1=5.1。

如果兩個向量的長度不同,R将利用循環規則,該規則重複較短的向量元素,直到得到的向量長度與較長的向量的長度相同。

在例一中,因為w1的長度是w2的兩倍,是以w2先補長為c(10,12,10,12)再與w1求和;在例二中,由于w1的長度不是w2的整倍數,不會出錯但是會有警告資訊,是以w2會補長為(10,12,14,10)再與w1求和。

3.生成數列

冒号運算符(:)會生成增量為1或者-1的數列。如果想生成1~10,增量為1的等差數列,或者是10~1,增量為-1的等差數列,執行以下代碼即可。

對于增量不為1的數列,可以使用seq函數。seq函數基本形式如下:

seq函數的主要參數如表2-2所示。

《R語言遊戲資料分析與挖掘》一2.2 資料對象

隻給出首項和尾項資料,by自動比對為1或-1。

給出首項和尾項資料以及長度,會自動計算等差的數值。

上例中,因為首項是1,尾項是-9,向量長度是5,是以等差的數值by=(-9-1)/(5-1)=-2.5。

給出首項和尾項資料以及等差的數值,會自動計算長度。

給出首項和等差的數值以及長度,會自動計算尾項。

rep()是重複函數,它可以将某一向量重複若幹次。其基本形式是rep(x,…)。其中x是預重複的序列,可以是任意資料類型的向量或數值。

設定times參數為2時,會将序列1,2,3,4重複兩次,如果希望得到向量中每個元素先重複兩次的重複數列,可以設定參數each=2。

也可以将向量賦予each參數。例如,想實作1,1,2,3,3,4這樣的重複數列,可以将向量c(2,1,2,1)賦予參數each。

與seq函數一樣,也可以通過參數length.out(可簡寫為len)設定重複數列的長度。

rep(1:4,times = 2)重複數列的長度是8,但是因為參數length.out限制了長度是6,是以輸出結果是1 2 3 4 1 2。

可見,如果設定的長度大于數列長度(10>8),則會以循環補齊的方式補全。

此外,還有letters和LETTERS函數,可以生成26個英文小寫字母和大寫字母。

4.向量索引

通常,隻需要通路向量中的部分或個别元素,可以通過在向量名後的方括号[ ]中加入向量索引來實作。

根據元素在向量中的位置選出元素,它的初始位置是1(而不像其他某些語言一樣是0)。

索引前加負号(-),排除向量中對應位置的元素,傳回其他位置的元素。

使用向量索引來選擇多個元素值。

使用邏輯向量根據條件來選擇元素。

使用表達式選擇元素。

以下三種索引方式都将傳回相同的值。

假如需要提取x中大于0的元素,隻需要在中括号中增加表達式x>0即可。背後原理就是x>0得到一個邏輯向量,然後傳回邏輯值為TRUE的元素。

which函數将傳回邏輯向量中為TRUE 的位置。例如,找出向量v中大于5的元素位置。

利用sample函數對序列1~10進行無放回随機抽取5個,得到向量v為c(3,8,4,7,6),是以大于5傳回的位置是2,4,5。

可以利用函數which.min和which.max查找向量中最大值和最小值的下标。

利用矩陣matrix可以描述二維資料,與向量相似,其内部元素可以是實數、複數、字元、邏輯型資料。矩陣matrix使用兩個下标來通路元素,A[i,j]表示矩陣A第i行、第j列的元素。

多元數組array可以描述多元資料。array有一個特征屬性叫維數向量(dim屬性),它的長度是多元數組的維數,dim内的元素則是對應次元的長度。矩陣是數組的特殊情況,它具有兩個次元。

在R中,可以使用matrix函數并以向量形式輸入矩陣中的全部元素,使用ncol和nrow可設定矩陣的行數和列數,進而建立一個矩陣。

先建立一個1~10數列的向量w,然後利用matrix函數将矩陣的行數設定為5,列數設定為2,得到矩陣a。注意,矩陣a的資料是按照列填充的,而在實際工作中,資料可能更多地是按照行填充,這時隻需要将參數byrow設定為TRUE即可。

給矩陣的行列命名有助于提高資料的可讀性,可通過參數dimnames實作。

函數cbind()把其自變量橫向拼成一個大矩陣,可以想象為水準地将矩陣拼在一起,rbind()把其自變量縱向拼成一個大矩陣,可以将其想象為垂直地将矩陣拼在一起。

當函數cbind()的自變量是矩陣或看作列向量的向量時,自變量的行數應該相等。當rbind()的自變量是矩陣或看作行向量的向量時,自變量的列數應該相等。如果參與合并的自變量比其變量短,則循環不足後合并。例如:

通過函數as.vector(A)可以将矩陣轉化為向量。例如:

可以使用colSums(列求和)、colMeans(列求平均)、rowSums(行求和)、rowMeans(行求平均)函數對矩陣的行、列求和或者求平均值,也可使用apply函數實作。

矩陣A第一列的元素是1、2、3、4,故第一列的和是1+2+3+4=10,第一列的平均值是(1+2+3+4)/4=2.5。

數組是矩陣的擴充,它把資料的次元擴充到兩個以上。這意味着數組中的元素需要兩個以上的索引。除此之外,數組與矩陣類似,可以使用相同的方法。與函數matrix( )類似,可以通過函數array( )友善地建立數組。

上面表示建立一個三維資料的數組,其次元是3×5×2。在結果中會依次展示2個3行5列的矩陣。

清單list和資料框data.frame也是一個二維資料,其中向量vector、多元數組array以及矩陣matrix存儲的元素,其資料類型是唯一的。清單和資料框内每列元素的資料類型可以不同,清單内的長度也可以不同。一般在使用R語言進行資料分析和挖掘的過程中,向量和資料框的使用頻率是最高的,清單則在存儲較複雜的資料時作為資料對象類型。

1.清單

清單可以使用list函數建立,函數的每一個參數變成清單的元素。

對象user.list由三個成分組成:第一個是名稱為user.id的數值,第二個是名稱為user.name的字元串,第三個是名稱為user.games的字元型向量。

可以使用length函數來檢查清單成分的個數。

2.資料框

資料框是僅次于向量的最重要的資料對象類型。在R語言中,很多資料分析算法函數的輸入對象都是資料框對象。而且,在使用讀取excel/csv/txt等格式資料集的函數時,也是以資料框對象輸入的。類似于list,資料框也可以由不同的向量作為列來合成,并且不同列之間的元素可以是不同的資料類型。但是資料框并沒有list那麼靈活,資料框内每個列的長度必須相同。在實際生産環境中,通常會用資料框的一列代表某一變量屬性的所有取值,用一行代表某一個樣本資料。

data.frame()函數可以直接将多個向量建立為一個資料框,并為列設定名稱。

我們建立了一個名為my.dataset的資料框,包含三列資料,其中第一列和第二列是字元型的資料類型,第三列是數值型的資料對象。

可以通過names函數檢視資料框的變量名稱。

也可以通過colnames函數檢視變量名稱,rownames函數檢視記錄名稱。以mtcars資料集為例:

names函數也可以直接修改變量名稱。例如,将my.dataset中的使用者id變量名稱改成vopenid,隻需執行以下代碼:

[1] "使用者ID" "遊戲名稱" "付費金額"

資料框的索引和矩陣類似,由于都是二維資料,是以它也有兩個次元的下标,同時資料框的列名稱也可以友善地索引資料框的列資料。

例如,提取my.dataset資料集中的第二列,有以下幾種方式實作:

如果想提取前三行、前兩列的資料,可以執行以下代碼:

繼續閱讀