在R中進行的所有操作都是針對活動內(nèi)存中的對象的。
此對象非彼對象。個人理解是我們輸入R中的一切是對象,得到的結(jié)果是對象,保存到計算機硬盤的也叫對象。所以,用R做分析時,你一直和對象在一起。
R中最簡單的命令就是輸入一個對象的名字然后顯示其內(nèi)容
> a<-10
> a
[1] 10
> print(a)
[1] 10
直接輸入對象的名字在這里與函數(shù)print(x)相同,但是在有些情況下,列入內(nèi)嵌在一個函數(shù)或循環(huán)中時,就必須用print()函數(shù)了。
對象的名字必須是以一個字母開頭,中間可以包含字母、數(shù)字、點(.)及下劃線(_)。字母區(qū)分大小寫,所以A 和a是不一樣的。起名的時候不要用保留字,保留字設(shè)計程序流程控制和特殊的變量類型,如if,else,repeat,TRUE,F(xiàn)ALSE,function,while等。
R中的對象主要是數(shù)據(jù)對象,當(dāng)然也有其他類型的對象。比如說我們在Y用R畫圖后得到的圖像也是對象。但是數(shù)據(jù)對象永遠(yuǎn)是我們接觸最多的對象。
數(shù)據(jù)也有不同的類型,什么向量,數(shù)組,矩陣、數(shù)據(jù)框、列表、因子都是數(shù)據(jù)類型
一張圖來大概展示一下:

我們要分析數(shù)據(jù),首先要有數(shù)據(jù),所以第一步要做的就是數(shù)據(jù)的創(chuàng)建。數(shù)據(jù)的創(chuàng)建既可以是手動的輸入也可以是導(dǎo)入其他文件形式的數(shù)據(jù),比如我們最常用的excel格式數(shù)據(jù)。
我們以手動輸入為例認(rèn)識一下各種數(shù)據(jù)類型
1向量vector
vector是用于儲存數(shù)值型、字符型和邏輯型數(shù)據(jù)的一組數(shù)組。
單個向量中的數(shù)據(jù)必須是同一類型的。
> #輸入數(shù)值型向量a
> a<-c(1,2,3)
> #輸入字符型向量b
> b<-c("one","two","three")
> #輸入邏輯型向量c
> c<-c(TRUE,TRUE,FALSE)
除了手動鍵入所有的數(shù)據(jù),還有一些函數(shù)可以幫我們輸入特定的數(shù)值型數(shù)據(jù)
#創(chuàng)建向量a為一組連續(xù)數(shù)值并查看a
> a<-1:10
> a
[1]? 1? 2? 3? 4? 5? 6? 7? 8? 9 10
從下面的例子中我們可以看到“:”的優(yōu)先級
> 1:10-1
[1] 0 1 2 3 4 5 6 7 8 9
> 1:(10-1)
[1] 1 2 3 4 5 6 7 8 9
還有一個幫助生成等距離序列的函數(shù)seq()
#生成一個從1到5,步長為0.5的序列
> seq(1,5,0.5)
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
或者
#從1到5,數(shù)據(jù)個數(shù)(length)為9的序列
> seq(length=9,from=1,to=5)
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
如果我們需要創(chuàng)建重復(fù)序列,用到的函數(shù)是rep()
在下面的例子中,我們只是輸入函數(shù)或表達(dá)式而不是把它的結(jié)果賦給某個對象,這樣只是在窗口中顯示結(jié)果,而不會被保存在內(nèi)存中。
> rep(2:5,times=2)
[1] 2 3 4 5 2 3 4 5
> rep(1:3,times=4,each=2)
[1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
> rep(2,4)
[1] 2 2 2 2
> rep(2:5,rep(2,4))
[1] 2 2 3 3 4 4 5 5
> rep(2:5,each=2)
[1] 2 2 3 3 4 4 5 5
函數(shù)sequence可以創(chuàng)建一系列連續(xù)的整數(shù)序列,每個序列都以給定參數(shù)的數(shù)值結(jié)尾。
> sequence(5)
[1] 1 2 3 4 5
> sequence(c(10,5))
[1]? 1? 2? 3? 4? 5? 6? 7? 8? 9 10? 1? 2? 3? 4? 5
> sequence(1:3)
[1] 1 1 2 1 2 3
在統(tǒng)計學(xué)中產(chǎn)生隨機序列是很有用的,R可以產(chǎn)生多種不同分不下的隨機數(shù)序列。
因為如果沒有統(tǒng)計學(xué)知識鋪墊,很難準(zhǔn)確理解這些函數(shù)的意義,在這里我們只給出了一個列表。
2因子factor
因子是由向量編譯過來的,因此它和向量是有區(qū)別的。因子的用法如下:
factor(x = character(), levels, labels = levels,exclude = NA, ordered = is.ordered(x), nmax = NA)
鍵入?factor在D區(qū)給出的定義是:
The function factor is used to encode a vector as a factor (the term 'category' and 'enumerated type' are also used for factors.)
個人理解:因子和向量的不同體現(xiàn)在因子側(cè)重列舉或類別,具體體現(xiàn)在因子中的水平(level)上,水平包含所有的不重復(fù)的數(shù)據(jù)類別以及在數(shù)據(jù)中不出現(xiàn)的數(shù)據(jù)類別。
講了那么多,大家可能還是不清楚,給個例子感受下:
#創(chuàng)建向量province
> province <- c("四川", "湖南", "江蘇", "四川", "四川", "四川", "湖南", "江蘇")
> province
[1] "四川" "湖南" "江蘇" "四川" "四川" "四川" "湖南" "江蘇"
#創(chuàng)建向量province的因子pf
> pf <- factor(province)
> pf
[1] 四川 湖南 江蘇 四川 四川 四川 湖南 江蘇
Levels: 湖南 江蘇 四川
再來些數(shù)值型的例子;
> factor(1:3)
[1] 1 2 3
Levels: 1 2 3
> factor(1:3,levels=1:5)
[1] 1 2 3
Levels: 1 2 3 4 5
> factor(1:3,labels=c("A","B","C"))
[1] A B C
Levels: A B C
> factor(1:3,exclude=4)
[1] 1 2 3
Levels: 1 2 3
函數(shù)levels用來提取一個因子中可能的水平值
> ff<-factor(c(2,4),levels=2:5 )
> ff
[1] 2 4
Levels: 2 3 4 5
> levels(ff)
[1] "2" "3" "4" "5"
有一個很有用的函數(shù)gl,能產(chǎn)生規(guī)則的因子序列。
這個函數(shù)的用法是gl(k,n),k是水平數(shù)或者類別數(shù),n是每個水平重復(fù)的次數(shù)。length用來指定產(chǎn)生數(shù)據(jù)的個數(shù),labels用來指定每個水平的名字。
> gl(3,5)
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Levels: 1 2 3
> gl(3,5,length=30)
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Levels: 1 2 3
> gl(3,5,length=15,label=c("yellow","blue","red"))
[1] yellow yellow yellow yellow yellow blue?? blue?? blue?? blue?? blue?? red??? red??? red??? red??? red??
Levels: yellow blue red
3矩陣matrix
矩陣是一個二維數(shù)組,學(xué)過線性代數(shù)的小伙伴應(yīng)該比較熟悉(唉,一直沒堅持學(xué)會過)
那么如何創(chuàng)建矩陣呢?
用函數(shù)matrix來創(chuàng)建,用法如下:
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
其中byrow=FALSE(默認(rèn))時,按列填充,byrow=TRUE時,按行填充。
#創(chuàng)建一個2x2的矩陣
> matrix(1:4,nrow=2,ncol=2)
???? [,1] [,2]
[1,]??? 1??? 3
[2,]??? 2??? 4
> #生成單位矩陣
> diag(3)
???? [,1] [,2] [,3]
[1,]??? 1??? 0??? 0
[2,]??? 0??? 1??? 0
[3,]??? 0??? 0??? 1
#創(chuàng)建由1到12排列的矩陣mat1,3行4列,按行填充數(shù)值
> mat1<-matrix(1:12,3,4,byrow=T)
> mat1
???? [,1] [,2] [,3] [,4]
[1,]??? 1??? 2??? 3??? 4
[2,]??? 5??? 6??? 7??? 8
[3,]??? 9?? 10?? 11?? 12
#創(chuàng)建由1到12排列的矩陣mat1,3行4列,按列填充數(shù)值
> mat2<-matrix(1:12,3,4,byrow=F)
> mat2
???? [,1] [,2] [,3] [,4]
[1,]??? 1??? 4??? 7?? 10
[2,]??? 2??? 5??? 8?? 11
[3,]??? 3??? 6??? 9?? 12
還有另外一種方法來創(chuàng)建矩陣:給維數(shù)適當(dāng)?shù)刭x值。
> x<-1:15
> x
[1]? 1? 2? 3? 4? 5? 6? 7? 8? 9 10 11 12 13 14 15
> dim(x)
NULL
> dim(x)<-c(5,3)
> x
???? [,1] [,2] [,3]
[1,]??? 1??? 6?? 11
[2,]??? 2??? 7?? 12
[3,]??? 3??? 8?? 13
[4,]??? 4??? 9?? 14
[5,]??? 5?? 10?? 15
4數(shù)據(jù)框data frame
個然感覺data frame就像我們用的Excel表格。不信來感受一下
#先對數(shù)據(jù)框的列向量進行賦值
> patientID<-c(1,2,3,4)
> age<-c(25,35,45,56)
> diabetes <- c("Type1", "Type2", "Type1", "Type1")
> status <- c("Poor", "Improved", "Excellent", "Poor")
#創(chuàng)建數(shù)據(jù)框patientdata
> patientdata <- data.frame(patientID, age, diabetes, status)
#顯示數(shù)據(jù)框patientdata
> patientdata
? patientID age diabetes??? status
1???????? 1? 25??? Type1????? Poor
2???????? 2? 35??? Type2? Improved
3?? ??????3? 45??? Type1 Excellent
4???????? 4? 56??? Type1????? Poor
現(xiàn)在只有4行數(shù)據(jù),假如我們有成百上千行的數(shù)據(jù),但只想查看數(shù)據(jù)框的列向量有哪些,不希望全部數(shù)據(jù)信息都顯示出來,可以這樣:
#只顯示數(shù)據(jù)框 patientdata前6行數(shù)據(jù)信息
> head(patientdata)
或者
#只顯示數(shù)據(jù)框 patientdata后6行數(shù)據(jù)信息
> tail(patientdata)
一般情況下數(shù)據(jù)框中的列向量必須有相同的長度。如果其中一個比其他的短,它將循環(huán)整數(shù)次以使得其長度與其他列向量相同,否則將報錯。
> x<-1:4; n<-10; M<-c(10,35);y<-2:4
> data.frame(x,n)
? x? n
1 1 10
2 2 10
3 3 10
4 4 10
> data.frame(x,M)
? x? M
1 1 10
2 2 35
3 3 10
4 4 35
> data.frame(x,y)
Error in data.frame(x, y) : 參數(shù)值意味著不同的行數(shù): 4, 3
用函數(shù)expand.grid()可以創(chuàng)建一個數(shù)據(jù)框,把各個向量的各水平進行完全隨機搭配。
> expand.grid(h=c(60,80),w=c(100,300),sex=c("male","female"))
?? h?? w??? sex
1 60 100?? male
2 80 100?? male
3 60 300?? male
4 80 300?? male
5 60 100 female
6 80 100 female
7 60 300 female
8 80 300 female
我們也可以對數(shù)據(jù)框進行一些操作:
#查看數(shù)據(jù)框 patientdata1到3列向量的數(shù)據(jù)信息
> patientdata[1:3]
? patientID age diabetes
1???????? 1? 25??? Type1
2???????? 2? 35??? Type2
3???????? 3? 45??? Type1
4???????? 4? 56??? Type1
#查看數(shù)據(jù)框 patientdata中名字為age列向量的數(shù)據(jù)信息
> patientdata$age
[1] 25 35 45 56
5列表list
列表就厲害了,是R數(shù)據(jù)類型中最復(fù)雜的一種,可以包含任何類型的數(shù)據(jù)結(jié)構(gòu),甚至是它自己。列表就像是一個大貨架,還是隨便組裝的那種。什么都能放進去,小貨架也能放。
> 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"
查看list的數(shù)據(jù)信息跟之前有一些不一樣的地方:
#查看列表mylist的第一個對象
> mylist[[1]]
[1] "My First List"
#查看列表mylist中名字為title的對象
> mylist$title
[1] "My First List"
除了這些數(shù)據(jù)類型,還有一些常用的對象
6時間序列Time-series
函數(shù)ts可以由向量(一元時間序列)或者矩陣(多元時間序列)創(chuàng)建一個時間序列型的對象。用法如下:
ts(data = NA, start = 1, end = numeric(), frequency = 1,deltat = 1, ts.eps = getOption("ts.eps"), class = , names = )
下面是用ts創(chuàng)建時間序列的例子
> ts(1:10,start=1959)
Time Series:
Start = 1959
End = 1968
Frequency = 1
?[1]? 1? 2? 3? 4? 5? 6? 7? 8? 9 10
> ts(1:47,frequency=12,start=c(1959,2))
???? Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1959?????? 1?? 2?? 3?? 4?? 5?? 6?? 7?? 8?? 9? 10? 11
1960? 12? 13? 14? 15? 16? 17? 18? 19? 20? 21? 22? 23
1961? 24? 25? 26? 27? 28? 29? 30? 31? 32? 33? 34? 35
1962? 36? 37? 38? 39? 40? 41? 42? 43? 44? 45? 46? 47
> ts(1:10,frequency = 4,start=c(1959,2))
???? Qtr1 Qtr2 Qtr3 Qtr4
1959???????? 1??? 2??? 3
1960??? 4??? 5??? 6??? 7
1961??? 8??? 9?? 10???
> ts(matrix(rpois(36,5),12,3),start=c(1961,1),frequency=12)
???????? Series 1 Series 2 Series 3
Jan 1961??????? 6??????? 6??????? 5
Feb 1961??????? 6??????? 6??????? 5
Mar 1961??????? 4??????? 5??????? 2
Apr 1961??????? 5??????? 3??????? 2
May 1961??????? 4?????? 10??????? 1
Jun 1961??????? 3??????? 4??????? 3
Jul 1961??????? 3??????? 7??????? 8
Aug 1961??? ????4??????? 2??????? 7
Sep 1961??????? 9??????? 9??????? 6
Oct 1961??????? 3??????? 5??????? 5
Nov 1961??????? 9??????? 0??????? 3
Dec 1961??????? 6??????? 5??????? 5
7表達(dá)式expression
表達(dá)式就是構(gòu)建數(shù)學(xué)公式,構(gòu)建好表達(dá)式,輸入任意值,就能求解:
用到的函數(shù)是expression()
> x<-2; y<-2.5;z<-1
> exp1<-expression(x/(y+exp(z)) )
> exp1<-expression(x/(y+exp(z)))
> exp1
expression(x/(y + exp(z)))
#用eval()來求解表達(dá)式
> eval(exp1)
[1] 0.3832679
參考文獻:
R?for beginners
ucas相關(guān)課程課件