R基礎概念
與其說R是一套統計軟體,不如說是一種統計分析和計算的「環境」。 向量化語言;數學運算會被自動套用到vector內的每個元素
物件概念
- R是以「物件 (Object)」為主體的「運算式語言 (Expression Language)」,亦即以物件導向為主的程式語言。利用指派(<-)來設定物件的名稱 (name)與內容 (content)。
- 物件的內容由「元素 (element)」,所以物件的型態與元素的型態是不同的
- mode()檢視元素的類型,class()檢視物件的類型 e.g. x<-1:24; dim(x) <- c(4, 6); mode(x) ## "numeric" class(x) ## "matrix"
- 檢視物件的屬性/特徵(attribute);作用於一個物件的函數取決物件的屬性。
- length()檢視物件的長度,也就是物件中元素的數目;(非「資料字元數」;nchar()顯示資料字元數) e.g. y<- c("I", "Love", "R") class(y) ## "character" length(y) ## 3,物件中的元素個數 nchar(y) ## 每個/資料元素的字元數;可以用來辨識字數
- 不管是哪種物件類型,內含的元素型態可區分:
- 數值 (numeric) 實數/雙浮點數 整數型 (integer)、小數(decimal fraction)、科學計數(scientific notation)。
- 複數型 (complex)
- 邏輯型(logical)
- 字元型(character) 某些情況下即便是數值,但也要當文字處理;eg: User ID或產品編號 (但概念和factor不同,factor類似類別,並沒有唯一的限制;但User ID或產品編號就要有唯一性)
物件類型
向量(vector),亦稱集合(collection)
- R中的向量vector並非數學上定義的向量,本身並無維度,沒有所謂行向量或列向量。c是代表結合(combination)
- 單個向量中的元素必須是同類型
- named vector: Bob<- c(age=27, height=187, weight=80) ;利用c()直接命名元素的名稱 name(Bob)則會傳回各維度的名稱;[1] "age" "height" "weight"
- 假設有兩個同長度的向量,兩個向量裡每個位置相互對應的元素都可以同時個別進行運算。如果兩個長度不想相等的向量做運算,比較短的向量會被循環使用,直到長的向量裡每個元素都有一個配對為止。如果長向量的長度不是短向量的倍數,會出現警告訊息。
- 使用[]來存取向量中的特定元素;預測第一個元素序號為1,非0 (如python)
- min()
- max()
- range()向量的範圍
- which.min()、which.max()第幾個分量是最小值或做大值
- sort()對向量排序
- rev()將向量按原方向的反方向排列
- rank()每個元素在資料排序的相對位置
- prod()向量元素的連乘積
- mean()
- median()
- var()
- sd()
- append()在向量中新增元素 append(y, 10:15, after=3) 在y向量中第三個元素後加入10-15
使用[]來存取向量中的特定元素;R預設第一個元素序號為1而非0
陣列(array);可視為多維度的向量,須先定義維度向量
array(1:24, dim = c(3,4,2)) ;或是寫成 X <- 1:24; dim(X) <- c(3,4,2)
- R會依照行的方式排列 (數據排列照不能像matrix行或列(byrow=T)?)
matrix
matrix(data=NA, nrow=1, ncol=1, byrow=FALSE, dimnames=NULL) byrow表示矩陣資料是要按列(byrow=TRUE)還是按行(byrow=FALSE)的順序排列 nrow列數、ncol行數、dimname幫行列命名 eg:
x <- matrix(1:24, nrow=4, ncol=6, byrow=TRUE) x [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 2 3 4 5 6 [2,] 7 8 9 10 11 12 [3,] 13 14 15 16 17 18 [4,] 19 20 21 22 23 24 x <- matrix(1:24, nrow=4, ncol=6, byrow=FALSE) x [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 5 9 13 17 21 [2,] 2 6 10 14 18 22 [3,] 3 7 11 15 19 23 [4,] 4 8 12 16 20 24
nrow()傳回列數、ncol()傳回行數
t(x)轉置矩陣
- % % 矩陣相乘 (若用,系統會將相同位置的兩數相乘,而非矩陣相乘)
- crossprod(A, B)等同於 t(A)%*%B,但效率更高
- diag() 產生對角矩陣;但如果輸入一正整數則產生對應為度的單位矩陣
- det()計算行列式值
- solve()傳回反矩陣
- eigen()計算特徵向量與特徵值
資料框架(data frame)
與矩陣結構相似,但資料框架可以在不同行中存在不同的資料型態,但同行的資料型態及長度必須相同(不同行代表不同attribute,即變數,名稱由每一行的名稱來定義),資料框架的每一列視為一組觀察值(observation)或案例(case),即instance。以統計用語來說,每一行代表一個變數,每一列則代表觀察值。
id <- c(1, 2, 3, 4) age <- c(25, 30, 35, 40) sex <- c("male", "male", "female", "female") pay <- c(30000, 40000, 45000, 50000) x.dataframe <- data.frame(id, age, sex, pay)
- R提供與Excel介面類似的編輯器,來建立或修改dataframe的值
edit(x.dataframe)
factor
- 類別變數(category variable);披著定量資料外殼的定性資料,以數字程式形式表現的字元類型資料(類似coding或歸類的概念,本看起來是數字,但是代表著某種特性)
- 也可視為一種特別的向量,用於將相同長度的離散資料向量做群組(grouping)
- 與vector很類似,但有另外的類別屬性(level)
- 取樣分類/層次(levels);factor的level代表該factor群組內的所有離散值(不重複的元素),並賦予每個獨特的元素一個唯一的整數值。由於factor只儲存不重複的元素,可以大量減少變數的容量。
- 字元標籤 (labels) sex=factor(c(1,1,0,0,1), levels=c(1,0), labels=c("female", "male")) 變更levels與labels,所得向量個元素設定值會發生對應變化;levels與labels有對應關係
- 不對levels或labels進行設定時,各字元的對應數字按照字母/筆劃順序(或level順序;或者自行設定排序)依序自1開始標示/轉為數值 num <- factor(c("b", "a", "d", "c")) as.numeric(num) # 2, 1, 4, 3 ;只是把factor中的元素轉成數值,但class(num)仍然為factor
- 一般而言,factor中level的排序並不重要。但也可設定order=TRUE來建立一個排序過的factor factor(X, levels=c(“A”, “B”, “C”), order=TRUE)
list列表
vector裡只能有相同型態的資料
list是一個以有序集合(order sequence)所構成的物件,組成可以是異質的物件
使用雙重中括號[[]]及序號值來取得list中某一位置的組成元素
family[[4]]
25 28 30
只使用一個中括弧[]及序號值,則是取得list中某一位置的組成元素及名稱
family[4]
$kid.age
[1] 28 28 30
family$kid.age[2] family[[4]][2]
packages套件
install.packages("XXXXXX") library("XXXXXX") remove.packages("XXXXXX") ##移除指定套件 installed.packages() ##顯示已經安裝的套件 library() ##顯示已安裝套件的簡易資訊 update.packages() ##更新所有已安裝的套件