學(xué)習(xí)小組Day5筆記-- 乳酸君

今天主要學(xué)習(xí)兩個數(shù)據(jù)類型:向量和數(shù)據(jù)框。下面也只是展現(xiàn)了最基礎(chǔ)的操作,以后將在學(xué)習(xí)的過程中慢慢補(bǔ)充。


Day5 向量與數(shù)據(jù)框

向量

  • 向量的概念
    在R語言當(dāng)中,元素指代的是字符串、數(shù)字等數(shù)據(jù)類型,可分為標(biāo)量向量。向量提示我們它是有方向的,我們可以簡單地將它定義為一排有序排列的元素。而標(biāo)量則可以簡單地理解為一個元素所組成的變量。

  • 向量的創(chuàng)建
    我們可以通過如下的方式創(chuàng)建一個新的向量:

冒號:用于創(chuàng)建某個數(shù)到另一個數(shù)的序列,默認(rèn)間隔為1;
c():用來拼接數(shù)值和向量;
vector():創(chuàng)建一個指定長度和類型的矢量,其中的結(jié)果可為0,F(xiàn)ALSE,空字符串或是NULL,格式為vector("數(shù)據(jù)類型",長度)
創(chuàng)建指定類型的空矢量:等同于上面的vector:
numeric(長度):創(chuàng)建指定長度的0
complex(長度):創(chuàng)建指定長度的0+0i
logical(長度):創(chuàng)建指定長度的FALSE
character(長度):創(chuàng)建指定長度的空字符串

  • 向量的序列
    除了上述的方式外,我們還可以通過如下方式創(chuàng)建更為通用的序列:

seq():可以創(chuàng)建從一個數(shù)到另一個數(shù)的序列,可指定步長,格式為seq(開始,結(jié)束,by= 步長 )
seq.int:與冒號類似創(chuàng)建一個從某個數(shù)到另一個數(shù)的序列,可指定步長,格式為seq.int(開始,結(jié)束,步長);
seq_len:創(chuàng)建一個從1開始到輸入值的序列,格式為seq_len(輸入值)
seq_along:創(chuàng)建一個從1開始,長度為輸入值的序列,也就是說我們不必知道一個向量當(dāng)中究竟有多少個元素,我們可以用此函數(shù)直接進(jìn)行展示

> seq(1,5,by=2)
[1] 1 3 5
> seq.int(3,12,2)
[1]  3  5  7  9 11
> seq_len(8)
[1] 1 2 3 4 5 6 7 8
> x<-c(red=1,yellow=3,blue=5,green=7)
> seq_along(x)
[1] 1 2 3 4
  • 向量的長度
    所有的向量都有一個長度,用來表示這個向量包含多少個元素,我們可以用length()函數(shù)進(jìn)行查看。

注意:
缺失值(NA)也會被計算在長度當(dāng)中;
字符串向量使用length()時計算的是字符串的數(shù)目,而非每個字符串中字符串的長度。換句話說,統(tǒng)計的是有幾個單詞,而不是有有幾個字母。如果想計算字母的個數(shù),我們可以使用nchar()函數(shù)

  • 向量的索引
    索引(也被成為子集、下標(biāo)、切片等),指代的是我們尋找向量中的某一部分或者部分元素的過程,通常通過中括號[]來實現(xiàn)。我們可以在中括號中加入以下的內(nèi)容:

正數(shù):會從第一個元素開始計數(shù),返回此位置上的向量元素;
如果[]的數(shù)字多于一個,我們要寫成如x[c(1,3,5)]這樣的格式,也可以應(yīng)用之前學(xué)過的冒號,寫出x[c(2:4)]這樣的索引;
負(fù)數(shù):會返回除了處于這些位置上的向量元素;
邏輯向量:會返回邏輯結(jié)果為TRUE的向量元素;
向量的名字:如果我們給向量中的每個元素進(jìn)行了命名,將會返回包含這些名字的向量元素

?在使用[]進(jìn)行索引的過程中,也有一些需要注意的地方,包括:

① 不能混合使用正數(shù)和負(fù)數(shù);
② 在[]中輸入正數(shù)和邏輯值時也可以加上缺失值NA,得到的對應(yīng)值也為缺失值。但是如果我們事先輸入了負(fù)數(shù),則[]中不允許出現(xiàn)缺失值NA;
③ []中出現(xiàn)超出矢量的長度的數(shù)值會返回缺失值NA;
④ 輸入非整數(shù),[]中的數(shù)值將自動向零舍入;
⑤ []中什么也不輸入將返回整個向量

> x<-c(red=1,yellow=3,blue=5,green=7)
> x
   red yellow   blue  green 
     1      3      5      7 
> x[3]
blue 
   5 
> x[-3]
   red yellow  green 
     1      3      7 
> x["red"]
red 
  1 

?除了中括號,我們還可以使用which()命令進(jìn)行索引,它將返回邏輯向量中結(jié)果為TRUE ?的元素。which.max()which.min()命令則返回向量中數(shù)值最大或者最小的那個元素:

> a<-1:10
> which(a>5)
[1]  6  7  8  9 10
> which.max(a)
[1] 10
> which.min(a)
[1] 1
  • 向量的重復(fù)
    如果需要將一段向量進(jìn)行重復(fù)的書寫,可以用到rep(要重復(fù)的向量,重復(fù)幾次)函數(shù),它的相關(guān)參數(shù)記錄如下:

each=:每個元素均重復(fù)幾次;
times=:每個元素分別重復(fù)幾次;
length.out=:最終輸出結(jié)果的長度

> rep(1:5,3)
 [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
> rep(1:5,each=3)
 [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
> rep(1:5,times=1:5)
 [1] 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
> rep(1:5,length.out=7)
[1] 1 2 3 4 5 1 2

數(shù)據(jù)框

  • 數(shù)據(jù)框的概念
    在R語言中,除了向量以外還有很多看起來很像表格的數(shù)據(jù)格式,包括:
    數(shù)組
    矩陣
    列表
    數(shù)據(jù)框
    元素類型角度:我們可以簡單地理解為數(shù)組和矩陣需要當(dāng)中的元素是同一類型的,比如都是數(shù)字;列表和數(shù)據(jù)框更接近我們實際當(dāng)中的表格,可以包含不同的數(shù)據(jù)類型,就像我們可以在每一列當(dāng)中分別寫出姓名(字符串)、年齡(整數(shù))、是否患?。ㄟ壿嫞┑取?br> 維度的角度數(shù)組和列表更復(fù)雜,可以進(jìn)行更多維度的嵌套,而矩陣和數(shù)據(jù)框就像是我們平時在紙上畫的那種簡單的表格一樣。
    (當(dāng)然,它們還有一些其他微妙的區(qū)別,以上只是自己比較籠統(tǒng)的概述。)

所以我們可以簡單地將數(shù)據(jù)框看為是一種可以儲存不同數(shù)據(jù)類型的矩陣,或是非嵌套的列表,其中每個元素具有相同的長度。

  • 數(shù)據(jù)框的創(chuàng)建
    一般我們都是從外部直接導(dǎo)入,很少直接自己在R語言中創(chuàng)建。創(chuàng)建的函數(shù)為data.frame()。雖然每一列之間的數(shù)據(jù)類型可以不同,但是同一列的元素類型必須相同,下面是一個簡單的例子:
> data_frame1<-data.frame(
+   x=letters[1:5],
+   y=rnorm(5),
+   z=runif(5)>0.5
+ )
> data_frame1
  x          y     z
1 a -0.5983922  TRUE
2 b  1.5111653 FALSE
3 c -0.1976543  TRUE
4 d  0.1837754  TRUE
5 e -0.6396710 FALSE
> class(data_frame1)
[1] "data.frame"

?其中列表為賦值時所給的x,y,z,而行名默認(rèn)為數(shù)字從1開始排序。我們可以通過row.names=這個參數(shù)對行名進(jìn)行更改。

  • 數(shù)據(jù)框的導(dǎo)入
    有很多格式和文本類型的標(biāo)準(zhǔn)可用于存儲數(shù)據(jù),如何將它們導(dǎo)入到R語言當(dāng)中變成R語言認(rèn)識的格式,是進(jìn)行數(shù)據(jù)分析的第一步。
    對于類似電子表格的數(shù)據(jù)通常存儲在逗號分隔值(CSV)制表符分隔文件之中,我們可以用read.table()進(jìn)行讀取,并將結(jié)果存儲在數(shù)據(jù)框中。
    而還有一些其他使用起來比較方便的read.table()的親戚,比如read.csv(),它使用逗號作為小數(shù)位,并假定該數(shù)據(jù)有標(biāo)題行。
    其中一些常用的參數(shù)包括:

header=TRUE:將第一行作為標(biāo)題行;
sep=‘某字符’:決定了使用哪個字符作為字段之間的分隔符,例如,sep='\t'則使用制表符作為分隔符;
fill=TRUE:將用NA代替缺失的部分;
nrow:指定讀取數(shù)據(jù)的行數(shù);
skip:決定跳過文件開始的多少行

> huahua<-read.table(file = "huahua.txt",sep = '\t',header = T)
> huahua
  X1 X2
1  A  1
2  B NA
3  C NA
4  D  3
5  E NA
> doudou<-read.csv("doudou.txt")
> doudou
  X1 X2
1  A  1
2  B NA
3  C NA
4  D  3
5  E NA
  • 數(shù)據(jù)框的行和列
    為了了解我們得到的數(shù)據(jù),我們首先要知道數(shù)據(jù)框當(dāng)中的每一行和每一列都表示什么信息,我們可以用下面的函數(shù)來查看行名和列名:
> rownames(huahua) #查看行名
[1] "1" "2" "3" "4" "5"
> colnames(huahua) #查看列名
[1] "X1" "X2"
> dimnames(huahua) #查看行名和列名
[[1]]
[1] "1" "2" "3" "4" "5"

[[2]]
[1] "X1" "X2"

?同樣,我們還可以用上面的例子來進(jìn)行行名列名的更改:

> colnames(huahua)[1]<-"bioplanet" #將第一列列名更改為bioplanet
> huahua
  bioplanet X2
1         A  1
2         B NA
3         C NA
4         D  3
5         E NA

?此外,為了了解數(shù)據(jù)的結(jié)構(gòu),我們還可以用下面的命令了解行數(shù)、列數(shù):

> nrow(huahua) #看數(shù)據(jù)庫有多少行
[1] 5
> ncol(huahua) #看數(shù)據(jù)庫有多少列
[1] 2
> dim(huahua) #看數(shù)據(jù)庫幾行幾列
[1] 5 2
  • 數(shù)據(jù)框的導(dǎo)出
    對數(shù)據(jù)框進(jìn)行處理后,我們可以用下面的方式進(jìn)行導(dǎo)出,其中最常用的函數(shù)為write.table(),我們首先給出要導(dǎo)出哪一個數(shù)據(jù)框(huahua),再對導(dǎo)出的文件進(jìn)行命名(day5.txt),sep參數(shù)更改分隔符為逗號,quote=F則取消字符串的雙引號。我們首先按照下面命令進(jìn)行運(yùn)行:
> write.table(huahua,file="day5.txt",sep = ',',quote = F)

?運(yùn)行后,我們發(fā)現(xiàn)工作目錄中多出了一個名為day5的txt文件:

導(dǎo)出數(shù)據(jù)框的結(jié)果
  • 數(shù)據(jù)框的索引
    與矩陣的索引類似,數(shù)據(jù)框中也可以使用4種不同的向量索引(正整數(shù)、負(fù)整數(shù)、邏輯值和字符),在中括號[]中,[x,y]表示x行y列,下面的例子對這種索引方式進(jìn)行了具體的闡釋:
> huahua[1,2]
[1] 1
> huahua[1,]
  bioplanet X2
1         A  1
> huahua[,2]
[1]  1 NA NA  3 NA
> huahua[,"X2"]
[1]  1 NA NA  3 NA
> huahua["X2"]
  X2
1  1
2 NA
3 NA
4  3
5 NA
> huahua[c(2,4),2]
[1] NA  3

?如果只選擇單列的話,還可以使用美元符號$或者帶有名稱或正整數(shù)的雙方括號[[]]:

> huahua$X2
[1]  1 NA NA  3 NA
> huahua[["bioplanet"]][2:3]
[1] B C
Levels: A B C D E

?如果想要使用邏輯向量,我們可以可以用sebset函數(shù)非常簡潔地給列加上條件篩選出來我們所需要的的那些列。subset()共需要三個參數(shù):一個數(shù)據(jù)框、一個行的邏輯條件、保留哪一列的名字(若省略則保留所有列):

> head(huahua)
  bioplanet X2
1         A  1
2         B NA
3         C NA
4         D  3
5         E NA
> subset(huahua,X2>0,bioplanet)
  bioplanet
1         A
4         D

反復(fù)使用數(shù)據(jù)框名的小技巧

在下面的例子中,我們反復(fù)使用到了數(shù)據(jù)框a這個變量。如果數(shù)據(jù)庫名字比較長,則會顯得很繁瑣,這時,我們可以有一些小技巧來解決這個問題:

options(stringsAsFactors = T)
a <-data.frame(case=paste0("S",1:9),values=runif(9))
plot(a$case,a$values)
  • attach
    我們首先可以利用attach()命令在搜索環(huán)境中添加數(shù)據(jù)框a,這樣便可以不用再下一次使用a的時候再打出數(shù)據(jù)框的名字了。但是使用完成后務(wù)必記得用detach命令退出,否則在有重名的變量、數(shù)據(jù)框時會很容易造成麻煩。
attach(a) #將數(shù)據(jù)框a添加到搜索環(huán)境中,以后我們再用a的時候不用再打它的全名了
plot(case,values)
detach(a)
  • with
    with函數(shù)也可以對需要反復(fù)輸入的數(shù)據(jù)框變量名進(jìn)行簡化,它接受一個數(shù)據(jù)框和要計算的表達(dá)式作為輸入?yún)?shù):
with(a,{              #{}外面的a指明在哪個數(shù)據(jù)框當(dāng)中進(jìn)行操作
 plot(case,values)    #大括號里面的plot()的變量沒有再使用a這個數(shù)據(jù)框名
x<<-summary(values)   #求和并賦值給x,<<的意思是作為全局變量,也就是出了大括號仍有效。
})

變量的保存

如果有時候我們尚未完成工作,需要暫時保存一部分變量或者腳本,我們可以采用下面的方法。注意變量名的書寫,否則會找不到目標(biāo)的對象:

> save.image(file="bioinfoplanet.RData") #保存當(dāng)前所有變量
> save(huahua,file="test.RData") #保存其中一個變量

而再次用到這些的時候,我們只需要輸入下面的命令就可以了:

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

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