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

向量
向量的概念
在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文件:

-
數(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時的加載命令