R語(yǔ)言中的數(shù)據(jù)結(jié)構(gòu)

哈哈,放假回到了家里很是開(kāi)心,晚上老媽做了好吃的。吃完飯坐在床上繼續(xù)寫(xiě)下學(xué)習(xí)記錄。不能學(xué)了perl又把R給丟了,這是不可取的,最忌諱的就是這一點(diǎn),之前就是因?yàn)閷W(xué)R而忘了perl的繼續(xù)學(xué)習(xí),導(dǎo)致現(xiàn)在又重新溫習(xí)perl。堅(jiān)持總結(jié),寫(xiě)代碼。

R語(yǔ)言

生物信息學(xué)需要掌握perl、R、linux shell,還有python等幾種編程語(yǔ)言。R語(yǔ)言在生物信息數(shù)據(jù)挖掘和繪圖方面發(fā)揮著很大的作用,bioconductor上有許多優(yōu)秀的與生物信息研究R包。今天主要記錄下R語(yǔ)言中的幾種數(shù)據(jù)類(lèi)型。

向量

在R中所有的數(shù)據(jù)結(jié)構(gòu)都是在向量的基礎(chǔ)上發(fā)展而來(lái)的,是由一系列類(lèi)型相同的有序元素構(gòu)成,R中向量默以列向量作為存儲(chǔ)類(lèi)型,有字符串向量、數(shù)字向量。

#創(chuàng)建向量
vec <- c(1,2,3,20)
vec <- c(1:10)
#判斷一個(gè)數(shù)據(jù)是否為向量最好不用is.vector(),因?yàn)闊o(wú)法區(qū)分原子向量和列表
li <- list()
is.vector(li) #返回TRUE,需要通過(guò)class函數(shù)
#創(chuàng)建帶有name屬性的變量(原子向量默認(rèn)是沒(méi)有names屬性以及dim屬性等其他屬性)
names(vec) <- letters[1:4] #name向量的長(zhǎng)度要與數(shù)據(jù)一致
#向量取值操作
b <- vec[1] #在R中向量索引值從1開(kāi)始,不同于perl
b <- vec["a"] #若向量有name屬性則可通過(guò)name訪問(wèn)數(shù)據(jù)
b <- vec[c(1,3)] #可以同時(shí)取出多個(gè)值
#將含有其他屬性的向量轉(zhuǎn)為原子向量
as.vector(vec) #將會(huì)去除names屬性
as.vector(li) #你將看到li沒(méi)有什么變化,因?yàn)閘ist就是vector
unlist(li) #需要用到unlist
#c()可以將多個(gè)向量合并成一個(gè)長(zhǎng)向量
vec1 <- 1:4
vec2 <- 2:4
vec3 <- c(1,2,3,4,vec1,vec2)

列表

列表也是一種向量,可看成是原子向量的升級(jí)版,列表中的每一個(gè)元素可以是不同的類(lèi)型結(jié)構(gòu),不同的長(zhǎng)度,呈現(xiàn)的內(nèi)容更加豐富

#創(chuàng)建list
li <- list() #創(chuàng)建空列表,這個(gè)在R for loop 的時(shí)候很有用,先定義一個(gè)空的數(shù)據(jù)結(jié)構(gòu)可以加快for loop的效率
li <- list("name"=c("wx","sc"),"score"=c(65,56),"male"=c(TRUE,FLASE))
#獲取list中的元素
li["name"] #保留方式(子集仍然是一個(gè)列表)
li[["name"]] #簡(jiǎn)化方式(返回的是一原子向量) 相當(dāng)于
li$name
li[["name"]][1] #獲得"wx"
#合并兩個(gè)列表
li1 <- list("subname"=c("ww","cc"))
list <- c(li,list)
#list 扁平化
#有時(shí)候在實(shí)際過(guò)程中需要將list 轉(zhuǎn)換成向量的形式,方便處理
unlist(list)
as.vector(unlist(list)) #去除names屬性

數(shù)組和矩陣

矩陣即是二維數(shù)組,矩陣和數(shù)組中只能是數(shù)字型數(shù)據(jù),由列向量組成。

a <- matrix(1:6,ncol=2,nrow=3) #創(chuàng)建3行2列矩陣,默認(rèn)按列排列
b <- matrix(1:6,ncol=2,nrow=3,byrow=TRUE)#指定按行排列
#行列命名
colnames(a) <- letters[1:2]
rownames(a) <- letters[1:2]
#子集選取
a[,1] #取出第一列
a[1,] #取出第一行
#矩陣合并
cbind(a,b) #按列合并(合并的矩陣行數(shù)要相等)
rbind(a,b) #按行合并(合并的矩陣列數(shù)要相等)
#數(shù)組
array <- array(1:20,dim=c(2,2,5)) #可以看成5個(gè)2x2矩陣
#dim屬性自定義向量為數(shù)組
a <-1:20
dim(a) = c(2,2,5)
#數(shù)組命名
dimnames(a) <- list(letters[1:2],letters[1:2],letters[1:5])
#矩陣的四則運(yùn)算
mat1 <- matrix(1:4,ncol=2)
mat2 <- mat1 / 2 #矩陣數(shù)乘運(yùn)算,每一個(gè)元素乘1/2
mat1 *mat2 #對(duì)應(yīng)元素相乘
mat1 / mat2 #對(duì)應(yīng)元素相除
mat1 + mat2 #矩陣的加法
mat1 - mat2 #矩陣的減法
mat1 %*% mat2 #這才是矩陣的乘法,左列=右行
#向量與矩陣相乘
矩陣與向量進(jìn)行乘法運(yùn)算時(shí), 向量按需要解釋成列向量或行向量。 當(dāng)向量左乘矩陣時(shí),看成行向量; 當(dāng)向量右乘矩陣時(shí),看成列向量。
c(1,1) %*% mat1 #向量左乘矩陣
mat1 %*% c(1,1) #向量右乘矩陣
#求行和、列和
colSums(mat1)
rowSums(mat1)
#apply family function
apply(mat1,1,sum) #列相加
apply(mat1,2,sum) #行相加

數(shù)據(jù)框

針對(duì)數(shù)組中只能是數(shù)字型數(shù)據(jù),不能為字符型變量因此就有了數(shù)據(jù)框這一結(jié)構(gòu),數(shù)據(jù)框源于數(shù)組,那么組成數(shù)據(jù)框的每一列向量必須要有相同的長(zhǎng)度

df1 <- data.frame("a" =1:12,"b" =letters[1:12],stringsAsFactors =F) #對(duì)于數(shù)據(jù)框中有字符型變量時(shí),令stringsAsFactors=F
#訪問(wèn)數(shù)據(jù)子集(數(shù)據(jù)框中的元素可以基于矩陣和列表的方式提取)
df1$a
df1[,1] #與上式等價(jià)
#和矩陣一樣可以求行和、列和
apply(df1,1,sum) 
apply(df1,2,sum)
#注意,在R中向量與矩陣加減運(yùn)算時(shí),向量默認(rèn)為列向量,向量中每一標(biāo)量一次與矩陣的每一行運(yùn)算,下面以scale函數(shù)為例
mat1 <- matrix(1:12,ncol=2,nrow=6)
average <- apply(mat1,2,mean)
sd <- apply(mat1,2,sd)
t(t(mat1) - average)/sd #這就實(shí)現(xiàn)了scale 函數(shù)
#數(shù)據(jù)框合并
rbind(df1,df2) #橫向合并,要求列名相同
cbind(df1,df2) #縱向合并,要求行數(shù)相同
df1 <- data.frame("name"=c("a","b","c"),"score"=sample(60:80,3)
df2 <- data.frame("name"=c("a","b"),"math"=sample(60:80,2))
#merge可以指定某一列合并
merge(df1,df2,by="name") #按照"name"列合并(當(dāng)兩數(shù)據(jù)框列名想等時(shí),用by指定相同列名名稱(chēng))
df3 <- data.frame("subname"=c("a","b"),"math"=sample(60:80,2))
merge(df1,df3,by.x="name",by.y="subname") #當(dāng)要合并的列名不相同時(shí),需要自定義指定不同的列名
merge(df1,df3,by.x="name",by.y="subname",all=T) #顯示兩列中的共有的元素
merge(df1,df3,by.x="name",by.y="subname",all.x=T) #只顯示df1中存在的列名元素,未能匹配的定義為NA
merge(df1,df3,by.x="name",by.y="subname",all.y=T) #只顯示df3中存在的列名元素,未能匹配的定義為NA

好了,關(guān)于R中的數(shù)據(jù)結(jié)構(gòu)就整理到這了,后期會(huì)陸續(xù)更新關(guān)于R的統(tǒng)計(jì)和畫(huà)圖方面的文章。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容