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

今天進(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谎替。
    R中的數(shù)據(jù)結(jié)構(gòu)

    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í)按住shiftenter就可以啦费尽!
    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)
quote=F

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代碼換行輸入

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市魁淳,隨后出現(xiàn)的幾起案子飘诗,更是在濱河造成了極大的恐慌,老刑警劉巖界逛,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昆稿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡息拜,警方通過查閱死者的電腦和手機(jī)溉潭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門净响,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喳瓣,你說我怎么就攤上這事馋贤。” “怎么了畏陕?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵配乓,是天一觀的道長。 經(jīng)常有香客問我蹭秋,道長扰付,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任仁讨,我火速辦了婚禮羽莺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘洞豁。我一直安慰自己盐固,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布丈挟。 她就那樣靜靜地躺著刁卜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪曙咽。 梳的紋絲不亂的頭發(fā)上蛔趴,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音例朱,去河邊找鬼孝情。 笑死,一個(gè)胖子當(dāng)著我的面吹牛洒嗤,可吹牛的內(nèi)容都是我干的箫荡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼渔隶,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼羔挡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起间唉,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤绞灼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后呈野,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镀赌,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年际跪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了商佛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姆打,死狀恐怖良姆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情幔戏,我是刑警寧澤玛追,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站闲延,受9級(jí)特大地震影響痊剖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垒玲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一陆馁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧合愈,春花似錦叮贩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寸莫,卻和暖如春捺萌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膘茎。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工桃纯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辽狈。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓慈参,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刮萌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驮配,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345