學習小組Day5筆記-小白之認識數(shù)據(jù)結(jié)構(gòu)

今天進一步跟隨生信星球的豆豆和花花了解R的數(shù)據(jù)結(jié)構(gòu),因為之前接觸過,因此筆記就主要是記錄一下自己在運行代碼過程中的一些探索吧。


認識數(shù)據(jù)結(jié)構(gòu)

  • 數(shù)據(jù)類型包括五種,有向量、矩陣、數(shù)組、數(shù)據(jù)框、List。
    R中的數(shù)據(jù)結(jié)構(gòu)

    1.向量
    向量是用于存儲數(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) #邏輯型向量
  • 注意:單個向量中的數(shù)據(jù)必須擁有相同的類型或模式,不能再同一個向量混雜不同模式的數(shù)據(jù)
  • 在花花老師的教程中,創(chuàng)建向量也用到了rep()函數(shù)和seq()函數(shù),前者為重復數(shù)值函數(shù),后者為順序函數(shù)。咱們來實戰(zhàn)看看結(jié)果。
#rep()函數(shù)
>x<-rep(1:4,each=2) #每個數(shù)值單獨重復兩遍
>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)  #每個數(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個元素
[1] 4
> x[-4] #去掉第4個元素
[1] 1 2 3 1 2 3 4
> x[2:4] #挑取第2-4個元素
[1] 2 3 4
> x[-(2:4)] #去掉第2-4個元素
[1] 1 1 2 3 4
> x[c(1,5)]  #挑取第1和第5個元素
[1] 1 1
#根據(jù)值挑取 
>x[x%in%c(1,4,6)]  #從x中挑取存在于向量c(1,4,6)中的元素,處理表達矩陣也經(jīng)常用到
[1] 1 4 1 4

2.矩陣
矩陣是一個二維數(shù)組,只是每個元素都擁有相同的模式(數(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個元素
[1] 16

3.數(shù)組
數(shù)組與矩陣類似,但是維度可以大于2,不只包括行和列,可以通過函數(shù)array()函數(shù)創(chuàng)建。myarray<-array(vector,dimensions,dimname)
dimensions是一個數(shù)值型向量,dimnames是可選的、各維度名稱標簽的列表。

> 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中的矩陣中第一行第二個元素,提取元素時量度數(shù)目一定要對應
> 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$實在是太麻煩了,懶蟲走捷徑的時候到了?。?!
    1.attach()、detach()和with()
    可以通過聯(lián)合使用函數(shù)attach()detach()或者單獨使用with()來達到簡化代碼的效果。
#此處以R自帶的mtcars數(shù)據(jù)框來講述這三個函數(shù)
> str(mtcars)  #查看mtcars的類型為data.frame,有32行,11個變量
'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)  #每次都要輸入前面的對象真的好麻煩
> 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ù)框,否則會影響其他操作
#但是當名稱相同的對象不止一個時,這種方法會顯得十分局限
> 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)境中就有一個mpg對象了,在這種情況下,原始對象將取得優(yōu)先權(quán),因此會出現(xiàn)報錯。
[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ù)進行關(guān)聯(lián)
> with(mtcars,{
     nokeepstats<-summary(mpg)
     keepstats<<-summary(mpg)
 })
> nokeepstats  #在Rstudio右上方中沒有找到這個對象的數(shù)值
錯誤: 找不到對象'nokeepstats'
> keepstats     #在Rstudio右上方中可以找到這個對象的數(shù)值
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.40   15.43   19.20   20.09   22.80   33.90 
#特殊賦值符:<<-替代標準賦值符<-可以將對象保存在with()之外的全局環(huán)境
  • 在輸入with()函數(shù)時有一個疑問,應該怎樣在控制臺上令操作命令換行呢?
    同時按住shiftenter就可以啦!
    5.列表
    列表是R的數(shù)據(jù)類型中最為復雜的一種。一般來說,列表是一些對象的有序集合。列表允許你整合若干(可能無關(guān)的)對象到單個對象名下。例如,某個列表中可能是若干向量、矩陣、數(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個成分,即ages
[1] 25 26 18 39

數(shù)據(jù)的導入和導出

(1)讀取本地數(shù)據(jù)

>setwd(" 本地工作目錄 ")  #注意要用正斜杠/
>getwd()   #查看當前工組目錄,以確保要導入的文件是否在當前工作
> 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時,會自動剔除掉NA值
  V1 V2
1 X1 X2
2  A  1
3  B   
4  C   
5  D  3
6  E   
  • sep 是函數(shù)的形式參數(shù),多數(shù)情況下, seq 參數(shù)用來指定字符的分隔符號。csv 文件是用逗號分隔的,故而 sep = ","tsv 文件是用制表符分隔的,故而 sep = "\t"常用的分隔符還有空格 sep = " "分隔符是任意的,可根據(jù)具體情況指定的。在輸入的時候,原內(nèi)容是用什么符號分隔的,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'  #修改第一行第一個元素名稱
  bioplanet X2
1         A  1
2         B NA
3         C NA
4         D  3
5         E NA

(3)數(shù)據(jù)框的導出

write.table(x,file = "yu.txt",sep = ",",quote=F) #分隔符改為以逗號分隔,字符串不加雙引號
write.table(x,file = 'li.txt',sep = ',',quote = T)
quote=F

quote = T

一個小問題
save(X,file="test.RData")這句代碼如果報錯object X not found,是為什么,應該怎么解決?

  • 這個就要看自己是不是沒有賦值X了,因為報錯提醒找不到X對象,注意這里的X是大寫的。如果沒有賦值就要添加一個賦值如:X<-,如果前面運行的是小寫的x,那這里的保存對象應該改回x。

參考:
R語言實戰(zhàn)(第2版)
生信星球
R語言里的sep什么意思
R語言實踐之Rstidio代碼換行輸入

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

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