今天進(jìn)一步跟隨生信星球的豆豆和花花了解R的數(shù)據(jù)結(jié)構(gòu),因?yàn)橹敖佑|過诬乞,因此筆記就主要是記錄一下自己在運(yùn)行代碼過程中的一些探索吧俊抵。
認(rèn)識(shí)數(shù)據(jù)結(jié)構(gòu)
- 數(shù)據(jù)類型包括五種谁不,有向量、矩陣徽诲、數(shù)組刹帕、數(shù)據(jù)框、List谎替。
1.向量
向量是用于存儲(chǔ)數(shù)值型偷溺、字符型或邏輯型數(shù)據(jù)的一維數(shù)組∏幔可以通過c()
函數(shù)來創(chuàng)建向量挫掏。
a<-c(1,2,3,4,5,6) #數(shù)值型向量
b<-c("one","two","three") #字符型向量
c<-c( TRUE,FALSE,TRUE) #邏輯型向量
- 注意:?jiǎn)蝹€(gè)向量中的數(shù)據(jù)必須擁有相同的類型或模式,不能再同一個(gè)向量混雜不同模式的數(shù)據(jù)
- 在花花老師的教程中秩命,創(chuàng)建向量也用到了
rep()
函數(shù)和seq()
函數(shù)尉共,前者為重復(fù)數(shù)值函數(shù),后者為順序函數(shù)弃锐。咱們來實(shí)戰(zhàn)看看結(jié)果袄友。
#rep()函數(shù)
>x<-rep(1:4,each=2) #每個(gè)數(shù)值單獨(dú)重復(fù)兩遍
>x
[1] 1 1 2 2 3 3 4 4
>x<-rep(1:4,2) #x<- rep(1:4,times=2)
>x
[1] 1 2 3 4 1 2 3 4
>x<-rep(1:4, c(2,2,2,2)) #rep(1:4,each=2)
[1] 1 1 2 2 3 3 4 4
>x<-rep(1:4, c(2,1,2,1) #每個(gè)數(shù)值各有各的情況
[1] 1 1 2 3 3 4
#seq()函數(shù)
> seq(0, 1, length.out = 11)
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> seq(stats::rnorm(20)) # effectively 'along'
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
> seq(1, 9, by = 2) # matches 'end'
[1] 1 3 5 7 9
> seq(1, 9, by = pi) # stays below 'end'
[1] 1.000000 4.141593 7.283185
> seq(1, 6, by = 3)
[1] 1 4
> seq(1.575, 5.125, by = 0.05)
[1] 1.575 1.625 1.675 1.725 1.775 1.825 1.875 1.925 1.975 2.025
[11] 2.075 2.125 2.175 2.225 2.275 2.325 2.375 2.425 2.475 2.525
[21] 2.575 2.625 2.675 2.725 2.775 2.825 2.875 2.925 2.975 3.025
[31] 3.075 3.125 3.175 3.225 3.275 3.325 3.375 3.425 3.475 3.525
[41] 3.575 3.625 3.675 3.725 3.775 3.825 3.875 3.925 3.975 4.025
[51] 4.075 4.125 4.175 4.225 4.275 4.325 4.375 4.425 4.475 4.525
[61] 4.575 4.625 4.675 4.725 4.775 4.825 4.875 4.925 4.975 5.025
[71] 5.075 5.125
> seq(17) # same as 1:17, or even better seq_len(17)
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
- 從向量中提取元素
> x<- rep(1:4,times=2) #向量
> x
[1] 1 2 3 4 1 2 3 4
> x[4] #挑取第4個(gè)元素
[1] 4
> x[-4] #去掉第4個(gè)元素
[1] 1 2 3 1 2 3 4
> x[2:4] #挑取第2-4個(gè)元素
[1] 2 3 4
> x[-(2:4)] #去掉第2-4個(gè)元素
[1] 1 1 2 3 4
> x[c(1,5)] #挑取第1和第5個(gè)元素
[1] 1 1
#根據(jù)值挑取
>x[x%in%c(1,4,6)] #從x中挑取存在于向量c(1,4,6)中的元素,處理表達(dá)矩陣也經(jīng)常用到
[1] 1 4 1 4
2.矩陣
矩陣是一個(gè)二維數(shù)組霹菊,只是每個(gè)元素都擁有相同的模式(數(shù)值型剧蚣、字符型或邏輯型),可以通過函數(shù)matrix()
創(chuàng)建矩陣。
> y<-matrix(1:20,nrow = 5,ncol = 4)
> y
[,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,26,24,68)
> rnames<-c("R1","R2")
> cnames<-c("C1","C2")
> mymatrix<-matrix(cells,nrow = 2,ncol = 2,byrow = TRUE,dimnames = list(rnames,cnames)) #byrow = TRUE,按行(row)填充2*2矩陣
> mymatrix
C1 C2
R1 1 26
R2 24 68
> mymatrix<-matrix(cells,nrow = 2,ncol = 2,byrow = FALSE,dimnames = list(rnames,cnames)) #byrow = FALSE,按列填充2*2矩陣
> mymatrix
C1 C2
R1 1 24
R2 26 68
#提取元素
> y[2,] #[行券敌,列]提取第2行數(shù)據(jù)
[1] 2 7 12 17
> y[,2] #提取第2列數(shù)據(jù)
[1] 6 7 8 9 10
> y[1,4] #提取第1行第4個(gè)元素
[1] 16
3.數(shù)組
數(shù)組與矩陣類似唾戚,但是維度可以大于2,不只包括行和列待诅,可以通過函數(shù)array()
函數(shù)創(chuàng)建叹坦。myarray<-array(vector,dimensions,dimname)
dimensions是一個(gè)數(shù)值型向量,dimnames是可選的卑雁、各維度名稱標(biāo)簽的列表募书。
> 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)) #dim3=4維,行為dim1,列為dim2
> 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
#提取元素
> d<-z[1,2,3] #z數(shù)組中的C3中的矩陣中第一行第二個(gè)元素测蹲,提取元素時(shí)量度數(shù)目一定要對(duì)應(yīng)
> d
[1] 15
4.數(shù)據(jù)框
數(shù)據(jù)框中不同的列可以包含不同模式(數(shù)值型莹捡、字符型等)的數(shù)據(jù),是R中經(jīng)常要處理的數(shù)據(jù)結(jié)構(gòu)扣甲±河可以通過函數(shù)data.frame()
來創(chuàng)建。mydata<-data.frame(col1,col2,col3,.....)
> 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
#選取數(shù)據(jù)框中的元素
> patientdata[1,] #挑取第1行
patientID age diabetes status
1 1 25 Type1 Poor
> patientdata[1:3,] #挑取第1到3行
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
> patientdata[1:3] #挑取第1到3列
patientID age diabetes
1 1 25 Type1
2 2 34 Type2
3 3 28 Type1
4 4 52 Type1
> patientdata$patientID #挑取特定列可以用$
[1] 1 2 3 4
- 每次都要鍵入patientdata$實(shí)在是太麻煩了琉挖,懶蟲走捷徑的時(shí)候到了F羝!示辈!
1.attach()寥茫、detach()和with()
可以通過聯(lián)合使用函數(shù)attach()
和detach()
或者單獨(dú)使用with()
來達(dá)到簡(jiǎn)化代碼的效果。
#此處以R自帶的mtcars數(shù)據(jù)框來講述這三個(gè)函數(shù)
> str(mtcars) #查看mtcars的類型為data.frame矾麻,有32行纱耻,11個(gè)變量
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
> summary(mtcars$mpg)
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.43 19.20 20.09 22.80 33.90
> plot(mtcars$mpg,mtcars$disp)
> plot(mtcars$mpg,mtcars$wt) #每次都要輸入前面的對(duì)象真的好麻煩
> attach(mtcars) #關(guān)聯(lián)數(shù)據(jù)框
> summary(mpg)
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.43 19.20 20.09 22.80 33.90
> plot(mpg,disp)
> plot(mpg,wt)
> detach(mtcars) #取消關(guān)聯(lián)數(shù)據(jù)框,否則會(huì)影響其他操作
#但是當(dāng)名稱相同的對(duì)象不止一個(gè)時(shí)险耀,這種方法會(huì)顯得十分局限
> attach(mtcars)
The following object is masked _by_ .GlobalEnv:
mpg
> plot(mpg,disp)
Error in xy.coords(x, y, xlabel, ylabel, log) :
'x' and 'y' lengths differ
> mpg #數(shù)據(jù)框mtcars被attach()綁定之前弄喘,環(huán)境中就有一個(gè)mpg對(duì)象了,在這種情況下甩牺,原始對(duì)象將取得優(yōu)先權(quán)限次,因此會(huì)出現(xiàn)報(bào)錯(cuò)。
[1] 24 24 26 26
> with(mtcars,{
print(summary(mpg))
plot(mpg,disp)
plot(mpg,wt)
})
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.43 19.20 20.09 22.80 33.90
#用with()函數(shù)進(jìn)行關(guān)聯(lián)
> with(mtcars,{
nokeepstats<-summary(mpg)
keepstats<<-summary(mpg)
})
> nokeepstats #在Rstudio右上方中沒有找到這個(gè)對(duì)象的數(shù)值
錯(cuò)誤: 找不到對(duì)象'nokeepstats'
> keepstats #在Rstudio右上方中可以找到這個(gè)對(duì)象的數(shù)值
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.43 19.20 20.09 22.80 33.90
#特殊賦值符:<<-替代標(biāo)準(zhǔn)賦值符<-可以將對(duì)象保存在with()之外的全局環(huán)境
- 在輸入
with()
函數(shù)時(shí)有一個(gè)疑問柴灯,應(yīng)該怎樣在控制臺(tái)上令操作命令換行呢?
同時(shí)按住shift
和enter
就可以啦费尽!
5.列表
列表是R的數(shù)據(jù)類型中最為復(fù)雜的一種赠群。一般來說,列表是一些對(duì)象的有序集合旱幼。列表允許你整合若干(可能無關(guān)的)對(duì)象到單個(gè)對(duì)象名下查描。例如,某個(gè)列表中可能是若干向量、矩陣冬三、數(shù)據(jù)框匀油,甚至其他列表的組合」窗剩可以使用list()
創(chuàng)建列表敌蚜。
> g<-"My First List"
> h<-c(25,26,18,39)
> j<-matrix(1:10,nrow=5)
> k<-c("one","two","three")
> mylist<-list(title=g,ages=h,j,k)
> mylist
$title
[1] "My First List"
$ages
[1] 25 26 18 39
[[3]]
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
[[4]]
[1] "one" "two" "three"
> mylist[[2]] #輸出list的第2個(gè)成分,即ages
[1] 25 26 18 39
數(shù)據(jù)的導(dǎo)入和導(dǎo)出
(1)讀取本地?cái)?shù)據(jù)
>setwd(" 本地工作目錄 ") #注意要用正斜杠/
>getwd() #查看當(dāng)前工組目錄窝爪,以確保要導(dǎo)入的文件是否在當(dāng)前工作
> read.table(file = 'huahua.txt',sep = '\t',header = T)
X1 X2
1 A 1
2 B NA
3 C NA
4 D 3
5 E NA
> read.table(file = 'huahua.txt',sep = '\t',header = F) #header=FALSE時(shí)弛车,會(huì)自動(dòng)剔除掉NA值
V1 V2
1 X1 X2
2 A 1
3 B
4 C
5 D 3
6 E
- sep 是函數(shù)的形式參數(shù),多數(shù)情況下蒲每, seq 參數(shù)用來指定字符的分隔符號(hào)纷跛。csv 文件是用逗號(hào)分隔的,故而 sep = ","tsv 文件是用制表符分隔的邀杏,故而 sep = "\t"常用的分隔符還有空格 sep = " "分隔符是任意的贫奠,可根據(jù)具體情況指定的。在輸入的時(shí)候望蜡,原內(nèi)容是用什么符號(hào)分隔的唤崭,sep就要保持一致,否則可能無法正確讀取泣特。
(2)設(shè)置行名和列名
> x<-read.csv('doudou.txt')
> x
X1 X2
1 A 1
2 B NA
3 C NA
4 D 3
5 E NA
> colnames(x)
[1] "X1" "X2"
> rownames(x)
[1] "1" "2" "3" "4" "5"
>colnames(x)[1]<-'bioplanet' #修改第一行第一個(gè)元素名稱
bioplanet X2
1 A 1
2 B NA
3 C NA
4 D 3
5 E NA
(3)數(shù)據(jù)框的導(dǎo)出
write.table(x,file = "yu.txt",sep = ",",quote=F) #分隔符改為以逗號(hào)分隔浩姥,字符串不加雙引號(hào)
write.table(x,file = 'li.txt',sep = ',',quote = T)
一個(gè)小問題:
save(X,file="test.RData")
這句代碼如果報(bào)錯(cuò)object X not found,是為什么状您,應(yīng)該怎么解決勒叠?
- 這個(gè)就要看自己是不是沒有賦值X了,因?yàn)閳?bào)錯(cuò)提醒找不到X對(duì)象膏孟,注意這里的X是大寫的眯分。如果沒有賦值就要添加一個(gè)賦值如:X<-,如果前面運(yùn)行的是小寫的x柒桑,那這里的保存對(duì)象應(yīng)該改回x弊决。
參考:
R語言實(shí)戰(zhàn)(第2版)
生信星球
R語言里的sep什么意思
R語言實(shí)踐之Rstidio代碼換行輸入