摘要:介紹R語言中常用的數(shù)據(jù)結構,向量辙纬、矩陣豁遭、列表贺拣、數(shù)據(jù)庫蓖谢、因子等。主要是它們的創(chuàng)建譬涡、索引和簡單的運算闪幽。
數(shù)據(jù)類型
-
主要的數(shù)據(jù)類型:
- 數(shù)值型:numeric
- 邏輯型:logical(T/TRUE F/FALSE)
- 字符型:character
- 復數(shù)型:complex(a+bi)
- 原味型:raw(二進制數(shù)據(jù))
- 缺省型:missing value(NA/not available)
關于數(shù)據(jù)類型的詳細介紹和操作參見另一篇課程筆記:R魔02_筆記_數(shù)據(jù)類型。
-
查看數(shù)據(jù):
查看當前系統(tǒng)里的數(shù)據(jù)對象涡匀,返回變量名:
ls()
-
辨別和轉換數(shù)據(jù)類型:
類型 辨別 轉換 character is.character() as.character() complex is.complex() as.complex() double is.double() as.double() integer is.integer() as.integer() logical is.logical() as.logical() NA is.na() as.na() numeric is.numeric() as.numeric()
數(shù)據(jù)結構
- 數(shù)據(jù)結構包括:
- 向量
- 矩陣
- 數(shù)組
- 數(shù)據(jù)框
- 因子factor/名義或等級
-
向量:
c()
- 直接創(chuàng)建向量:同一向量中的數(shù)據(jù)必須是同一個類型的盯腌。
> a <- c(1, -2, 3, -4, 5, 0) > b <- c("age","name" , "weight") > C <- c(TRUE, TRUE, FALSE, FALSE) > a <- c(2:6) # 冒號"n:m"表示從n到m,包含n和m陨瘩。 # 等價于 > a <- c(2, 3, 4, 5, 6) > r <- c(5:1) #逆序 > r 5 4 3 2 1 # 冒號運算的結果其實也是個向量 > 2*1:5 #表達式中:的級別最高 [1] 2 4 6 8 10
- 用函數(shù)生成向量:
# 1. 生成有規(guī)律的序列 > seq(1,10,2) # seq(from, to, by)腕够,從1到10级乍,間隔為2。 [1] 1 3 5 7 9 > seq(1, by=2, length=10) #從1開始帚湘,間隔為2玫荣,總共要10個數(shù)。 [1] 1 3 5 7 9 11 13 15 17 19 > letters[1:30] #生成字母序列大诸,abcd捅厂,26個,第26之后的值為NA # 2. 重復 > rep(c(1,2),4) # 向量整體4次 [1] 1 2 1 2 1 2 1 2 > rep(c(1,2),each=4) # 按元素重復 [1] 1 1 1 1 2 2 2 2 > rep(c(1,2,3,4),c(5,3,4,2)) # 向量元素分別重復5432次底挫。必須一樣長恒傻。 [1] 1 1 1 1 1 2 2 2 3 3 3 3 4 4
- 選擇向量中的元素
> a <- c(1, -2, 3, -4, 5, 0) > a[3] [1] 3 > a[2,3] # 選擇兩個 [1] -2 3 > a[1:4] # 選擇多個連續(xù) 1 -2 3 -4 > a[-2] # 去掉第2個元素 1 3 -4 5 0 # 用向量選擇 > a[c(1,3,4)] # 一定要有c()函數(shù),a[1,2,3]是錯的 # 布爾 > a[a<3] # 列出小于3的元素
- 用which()函數(shù)選擇
which.max(a) #()里是向量名建邓。返回下標盈厘。 which.min(a) a[which.max(a)] #返回最大值 which(a==2) #所有等于2的元素,的位置/下標官边。 which(a>3)
注意:向量不能添加或刪除元素沸手。改變向量需要重新賦值。
-
附:常用的向量計算函數(shù)
sum() #求和 max() #求最大值 min() #求最小值 range() #求極差(全矩) mean() #均值 median() #中數(shù) var() #方差 sd() #標準差 sort() #排序注簿,從小到大 rev() #反向排列rev(sort()) rank() #給出向量的秩(每個元素的排名) prod() #向量的連乘積 append() #添加元素 replace() #替換 match() #匹配 pmatch() #部分匹配 all() #判斷所有 any() #判斷部分
-
矩陣:
matrix()
默認按列生成- 創(chuàng)建矩陣
> y <- matrix(1:20, nrow=5, ncol=4) [,1] [,2] [,3] [,4] [1,] 1 6 11 16 [2,] 2 7 12 17 [3,] 3 8 13 18 [4,] 4 9 14 19 [5,] 5 10 15 20 > cells <- c(1,4,6,10) > rname <- c("r1","r2") > cname <- c("c1","c2") > mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rname, cname)) mymatrix #byrow=TRUE按行填充 c1 c2 r1 1 4 r2 6 10 > diag(1:4) #生成對角矩陣 [,1] [,2] [,3] [,4] [1,] 1 0 0 0 [2,] 0 2 0 0 [3,] 0 0 3 0 [4,] 0 0 0 4 > diag(4) #4階單位陣 [,1] [,2] [,3] [,4] [1,] 1 0 0 0 [2,] 0 1 0 0 [3,] 0 0 1 0 [4,] 0 0 0 1
- 矩陣索引
mymatrix <- matrix(1:20, nrow=5, ncol=4) > mymatrix[1,2] #選擇矩陣里的元素[行, 列] 6 > mymatrix[1:2,2:3] #第1 2行契吉,2 3列的元素 [,1] [,2] [1,] 6 11 [2,] 7 12
- 矩陣的運算
A+10 #所有元素加10 A*2 #所有元素乘2 A*A #所有元素乘自己 A%*%B #矩陣相乘【A(m,n)的列數(shù)(column)與B(n,p)的行數(shù)(row)相同才行,得到是一個m行诡渴,p列的矩陣】 dim() #返回行捐晶、列數(shù)(如果是array,返回每個維度的行列數(shù) str(object) #顯示某個對象的結構 class(object) #顯示某個對象的類或類型 nrow() #返回行數(shù) ncol() #返回列數(shù) solve() #返回逆矩陣【逆矩陣:兩個矩陣相乘等于一個單位矩陣(見上)】 solve(a,b) #a*x=b妄辩,求x惑灵。得出的是x的值。 as.matrix() #把非矩陣的轉換成矩陣 is.matrix() #辨別是否矩陣 diag() #返回對角元素或生成對角矩陣 eigen() #求特征值和特征向量 chol() #Choleski 分解 【眼耀?英支??】 svd() #奇異值分解 【哮伟?干花??】 qr() #QR 分解 【楞黄?池凄??】 det() #求行列式 t() #矩陣轉置 apply(X, MARGIN, FUN, ...) #對矩陣應用函數(shù)谅辣。x:矩陣名修赞;MARGIN:運算范圍,1/按行運算,2/按列運算柏副;FUN:調用的函數(shù)勾邦。得到一個向量。 rbind() #合并兩個或兩個以上的矩陣割择,按行合并眷篇。(列數(shù)不變 cbind() #按列合并。(行數(shù)不變
-
數(shù)組:函數(shù)array()
- 簡單說一下荔泳。
> dim1 <- c("A1","A2") > dim2 <- c("B1","B2","B3") > dim3 <- c("C1","C2","C3","C4") > z <- array(1:24, c(2, 3, 4), dimnames = list (dim1, dim2, dim3)) > z , , C1 B1 B2 B3 A1 1 3 5 A2 2 4 6 , , C2 B1 B2 B3 A1 7 9 11 A2 8 10 12 , , C3 B1 B2 B3 A1 13 15 17 A2 14 16 18 , , C4 B1 B2 B3 A1 19 21 23 A2 20 22 24
-
數(shù)據(jù)框:最常見的數(shù)據(jù)結構
data.frame()
- 矩陣形式的數(shù)據(jù)必須是同一類型的蕉饼,但數(shù)據(jù)框中各列可以是不同類型的數(shù)據(jù)。
- 每一列長度一致玛歌∶粮郏可以是向量、因子支子、數(shù)據(jù)矩陣创肥、列表、或其他數(shù)據(jù)框值朋。
- 字符向量會被強制轉換成因子
> patientID<-c(1,2,3,4) > age<-c(25,34,28,52) > diabetes<-c("Type1","Type2","Type1","Type1") > status<-c("Poor","Improved","Excellent","Poor") > patientdata<-data.frame(patientID, age, diabetes, status) > patientdata patientID age diabetes status 1 1 25 Type1 Poor 2 2 34 Type2 Improved 3 3 28 Type1 Excellent 4 4 52 Type1 Poor patientdata[1:2] # 選取列 patientdata[1:2,] # 選取行 patientdata[c("diabetes","status")] # 用列名選取 patientdata$age # 用列名選取的另一種方法 table(patientdata$diabetes, patientdata$status) # 名義變量做交叉列聯(lián)表叹侄。
- 使用attach()/detach()和with():可以不用寫數(shù)據(jù)框的名字,直接用數(shù)據(jù)庫中列名昨登。
attach(patientdata) summary(age) detach(patientdata) with(patientdata,{ summary(age) })
-
因子
factor()
- 分類數(shù)據(jù)
- factor(data, levels, labels,...)
# factors把字符型的名義變量 變?yōu)?用數(shù)字代表類別。常用于離散型數(shù)據(jù)丰辣。 patientID<-c(1,2,3,4) age<-c(25,34,28,52) diabetes<-c("Type1","Type2","Type1","Type1") status<-c("Poor","Improved","Excellent","Poor") diabetes<-factor(diabetes); diabetes status<-factor(status, order=T, levels = c("Poor", "Improved","Excellent"));status # order = T撒强,有序性因子,按字母排序笙什。用levels設定順序尿褪。 patientdata<-data.frame(patientID, age, diabetes, status) str(patientdata) # 查看dataframe summary(patientdata)
-
列表list
- list是一個對象的有序合集,包含的對象叫做components/分量得湘。
- 語句list(變量1=分量1, 變量2=分量2顿仇,……)
- 函數(shù)length()淘正、 mode()、 names()可以分別返回列表的長度(分量的數(shù)目)臼闻、數(shù)據(jù)類型鸿吆、列表里成分的名字。
- 元素可以不同類型述呐。迭代惩淳。雙層中括號[[]]選擇元素,第一維是名稱,第二維才是數(shù)值思犁。
# 創(chuàng)建列表 #1. 使用list() > j <- list(name="Joe",salary=55000, union=T); j $name [1] "Joe" $salary [1] 55000 $union [1] TRUE #2. 把向量轉為列表形式 z <- vector(mode="list") z[["list"]] <- 3 # 列表索引 > j$salary [1] 55000 j[["salary"]] #注意單層中括號和雙層中括號的區(qū)別 j[[2]] j[1:2] # 增加列 j$sex<-"M" #增加一個叫做“sex”的列 j[6:8]<-c(E,F,T);j #增加三列代虾,分別叫做E/F/T,位置在6到8. # 刪除列 j$sex<-NULL;j #sex這列就不見了