R語言基礎:數組和列表
數組(array)
一維數據是向量,二維數據是矩陣,
數組是向量和矩陣的直接推廣,是由三維或三維以上的數據構成的.
數組函數是array(),語法是:array(dadta, dim),其中data必須是同一類型的數據,dim是各維的長度組成的向量。
1、產生一個三維和四維數組。
例1:xx <- array(1:24, c(3, 4, 2)) #一個三維數組
例2:yy <- array(1:36, c(2, 3, 3, 2)) #一個四維數組
2、dim()函數可將向量轉化成數組或矩陣。
例1:xx <- 1:24; dim(xx) <- c(3, 4, 2); xx #效果同array(1:24, c(3, 4, 2))
例2:zz <- 1:10; dim(zz) <- c(2, 5); zz #效果同matrix(1:10, 2, 5)
列表(list)
向量、矩陣和數組的元素必須是同一類型的數據。
一個數據對象需要包含不同的數據類型,它可以采用列表這種形式。
創建列表可用list()函數,語法是:list(name1 = component1, name2 = component2, ...)。
1、創建一個列表
例1: xx <- rep(1:2, 3:4)
yy <- c('Mr A', 'Mr B', 'Mr C', 'Mr D', 'Mr E', 'Mr D', 'Mr F')
zz <- 'discussion group'
name.list <- list(group = xx, name = yy, decription = zz) #創建了一個名為"name.list"的列表
name.list$n[name.list$g == 2]
length(name.list)
mode(name.list)
names(name.list)
向量(vector)
1、seq():產生有規律的數列,間距省略時默認值為1。
例1:seq(10, 20, 0.5)
例2:seq(0, by = 0.03, length = 15)
2、rep():產生有規律的數列,重復第一個變量若干次。
例1:rep(1:3, 1:3)
例2:rep(1:3, rep(2, 3))
例3:rep(1:3, length = 10)
3、向量運算:一般是對應元素之間的運算,所以兩個或多個向量運算時,要求它們包含的元素個素相同(或一個是另一個的整數倍)。
例1:a <- 1:3; b <- 4:6; a * b; b^a
例2:a <- 1:3; b <- 4:9; a * b; b^a
4、獲取向量某一個或多個子集,向量前的負號"-"表示去除相應內容。
例1:x <- c(3, 4, 5, 2, 6); x[1:2]; x[-(1:2)]
例2:x <- c(3, 4, 5, 2, 6); x[c(1, 2, 4, 1)]; x[-c(1, 2, 4, 1)]
例3:xx <- seq(1, by = 3, length = 10); xx[xx > 13]
例4:x <- 1:20; y <- -9:11; x[y > (1)] #注意最后一個是"NA"
5、主要向量運算函數。
例1:xx <- c(2, 6, 10, 8, 4)
sum(xx) #和
max(xx) #最大值
min(xx) #最小值
range(xx) #取值范圍
mean(xx) #平均值
var(xx) #方差
sort(xx) #從小到大排序
rev(xx) #反排列, 所以從大到小排序應該是rev(sort(xx))
rank(xx) #單元值大小順序
prod(xx) #乘積,所以階乘是prod(1:n)
例2:x <- seq(1, 15, 2)
append(x, 20:30, after = 5) #插入數據
append(x, 20:30) #參數after缺省默認從向量的最后插入值
replace(x, c(2, 4, 6), -1) #替換函數
例3:state.name
match(c('Ohio', 'Wyoming'), state.name) #完全匹配函數
pmatch(c('Oh', 'Wy'), state.name) #部分匹配函數
state.name[pmatch(c('Oh', 'Wy'), state.name)]
例4:yy <- -9:10
all(yy > 0) #判斷所有
all(yy > -10)
any(yy == 0) #判斷部分
any(yy > 0)
any(yy < -10)
矩陣
矩陣(matrix)
矩陣生成函數matrix():matrix(data, nrow = , ncol = , byrow = F),其中,數據data是必須的,其他都是選擇參數,可以不選。byrow = F默認為按列來排列數據,如果想要按行排列,令byrow = T。
1、對角矩陣和單位陣。
例1:x <- 1:6; diag(x) #對角矩陣
例2:y <- rep(1, 5); diag(y) #單位陣
2、矩陣下標
例1:xx <- matrix(1:20, 4, 5)
xx[2, 2]; xx[2, 3:5]; xx[3:4, 3:4]
xx[2, ]; xx[ , 2]
3、代數意義下的矩陣乘法"%*%"
例1:yy <- matrix(1:6, 3, 2); zz <- matrix(1:6, 2, 3)
yy %*% zz; zz %*% yy
4、矩陣行和列的維數
例1:xx <- matrix(1:20, 4, 5)
dim(xx) #行和列的維數
nrow(xx); ncol(xx) #行數和列數
5、矩陣的主要運算函數
例1:x <- 1:6; y <- as.matrix(x) #轉換成矩陣
is.matrix(x); is.matrix(y) #判斷是否矩陣
例2: diag() #方陣對角線元素或者生成對角矩陣
apply() #對矩陣應用函數
eigen() #求特征值和特征向量
solve() #求逆矩陣
chol() #Choleski分解
svd() #奇異值分解
qr() #QR分解
det() #求行列式
dim() #給出行列數
t() #矩陣轉置
6、矩陣合並
例1:aa <- matrix(1:6, 3, 2); bb <- matrix(7:12, 3, 2)
cbind(aa, bb) #按列合並
rbind(aa, bb) #按行合並
7、矩陣apply()運算函數:語法是apply(data, dim, function),dim取1表示對行運用函數,取2表示對列運用函數。
例1:xx <- matrix(1:20, 4, 5)
colMeans(xx) #列均值
colSums(xx) #列和
其余大部分都要用到apply()函數
例2:xx <- matrix(1:20, 4, 5)
apply(xx, 2, mean) #列均值,等同於colMeans(xx)
apply(xx, 2, sum) #列和,等同於colMeans(xx),所以矩陣行和列的運算推薦用apply()。
apply(xx, 1, var) #行方差
apply(xx, 2, max) #每列最大值
apply(xx, 2, rev) #每列的數反排列
因子(factor)和有序因子(ordered factor)
一、因子的特點或性質
1、因子可視為C或JAVA語言中的枚舉,適用於有限狀態的表示。
2、因子不可以賦枚舉集合外的值,如一個因子包含male,female,則不能再賦male和female以為的值,賦其他值會將該元素設置為空值。
因子用來存儲類別變量(categorical variables)和有序變量,這類變量不能用來計算而只能用來分類或者計數。因子表示分類變量,有序因子表示有序變量。

在R語言中,因子(factor)表示的是一個符號、一個編號或者一個等級,即,一個點。例如,人的個數可以是1,2,3,4......那么因子就包括,1,2,3,4.....還有統計量的水平的時候用到的高、中、低,也是因子,因為他是一個點。與之區別的向量,是一個連續性的值,例如,數值中有1,1.1,1.2......可以作為數值來計算,而因子則不可以。如果用我自己的理解,簡單通俗來講:因子是一個點,向量是一個有方向的范圍。
在R中,如果把數字作為因子,那么在導入數據之后,需要將向量轉換為因子(factor),而因子在整個計算過程中不再作為數值,而是一個"符號"而已。
因子(factor)和有序因子(ordered factor)
因子用來存
儲類別變量(categorical variables)和
有序變量,這類變量不能用來計算而只能用來分類或者計數。
因子表示分類變量,有序因子表示有序變量。
生成因子數據對象的函數是factor(),語法是factor(data, levels, labels, ...),其中data是數據,levels是因子水平向量,labels是因子的
標簽向量。
1、創建一個因子。
例1:colour <- c('G', 'G', 'R', 'Y', 'G', 'Y', 'Y', 'R', 'Y')
col <- factor(colour)
col1 <- factor(colour, levels = c('G', 'R', 'Y'), labels = c('Green', 'Red', 'Yellow')) #labels的內容替換colour相應位置對應levels的內容
col2 <- factor(colour, levels = c('G', 'R', 'Y'), labels = c('1', '2', '3'))
col_vec <- as.vector(col2) #轉換成字符向量
col_num <- as.numeric(col2) #轉換成數字向量
col3 <- factor(colour, levels = c('G', 'R'))
2、創建一個有序因子。
若因子需要有序,比如差,一般,好,很好,非常好,則可使用order參數:order=TRUE。
例1:score <- c('A', 'B', 'A', 'C', 'B')
score1 <- ordered(score, levels = c('C', 'B', 'A')); score1
3、用cut()函數將一般的數據轉換成因子或有序因子。
例1:exam <- c(98, 97, 52, 88, 85, 75, 97, 92, 77, 74, 70, 63, 97, 71, 98, 65, 79, 74, 58, 59, 60, 63, 87, 82, 95, 75, 79, 96, 50, 88)
exam1 <- cut(exam, breaks = 3) #切分成3組
exam2 <- cut(exam, breaks = c(0, 59, 69, 79, 89, 100)) #切分成自己設置的組
attr(exam1, 'levels'); attr(exam2, 'levels'); attr(exam2, 'class')
ordered(exam2, labels = c('bad', 'ok', 'average', 'good', 'excellent')) #一個有序因子
數據框
數據框(data frame)
數據框是一種矩陣形式的數據,但數據框中各列可以是不同類型的數據。數據框每列是一個變量,每行是一個觀測。數據框可以看成是矩陣的推廣,也可看作一種特殊的列表對象,很多高級統計函數都會用到數據框。
數據框用函數data.frame()生成,語法是:data.frame(data1, data2, ...)
1、生成一個數據框
例1:name <- c('Mr A', 'Mr B', 'Mr C'); group <- rep(1, 3); score <- c(69, 71, 92)
dd <- data.frame(name, group, score)
2、合並數據框
例1:name <- c('Ms C', 'Ms D'); group <- c(2, 2); score <- c(93, 99)
dd1 <- data.frame(name, score, group) #注意這里排列順序與dd中不同
dd2 <- rbind(dd, dd1) #行合並結果與dd排列順序一致,說明其中有一個匹配過程。
dd3 <- rbind(dd1, dd)
例2:age <- c(14, 15, 14, 16, 13)
dd4 <- cbind(dd2, age) #列合並
dd4[2, 3]; dd4$score[2]
3、"連接"函數
attach()和detach()函數是應用數據框時很有用的工具。
attach()函數將數據框連接入當前工作空間,detach()取消連接。
如果不用attach(),需要用$提取數據框內某一列數據。
1、attach()和detach()函數的應用
例1:girl1 <- read.table('d:/girl1.txt', head = T) #讀取數據
WT2
attach(girl1) #連接入當期工作空間
WT2 <- 12:13
mode(WT2) #結果時數值型
rm(WT2)
detach(girl1) #取消連接
WT2
girl1$WT2
-----R對象和數據組織---------------
來源:http://blog.csdn.net/enjoy_learn/article/details/52422501
R的數據對象:
---存儲角度:數值型,字符型,邏輯型
---結構角度:向量(具有相同存儲類型數據的集合)
矩陣(列:變量,行:觀測)--二維表格
數組(多張二維表的集合)
數據框(與矩陣類似,用於存儲多個存儲類型不同的變量)
列表:向量、矩陣、數組、數據框的集合
-----------------------------------------------------------------
創建和訪問R的數據對象
---(1)創建R的數據對象:對象名<-R常量或R函數
--- (2)訪問R的數據對象:對象名或print(對象名)
----(3)查看R的數據對象的結構:str(對象名)
-----(4)管理R的數據對象:ls():顯示當前工作區間的變量名列表
-------rm(對象名或對象名列表),remove(對象名):刪除當前工作區間的指定對象。
-----------------------------------------------------------------------
調用R的向量組織數據
判斷數據對象是否為向量:is.vector(數據對象名)
創建只包含一個元素的向量:標量
------對象名<-R常量
-----(V4<-TRUE),幅值語句直接放入括號內,表示創建對象,並直接顯示對象值
-----#開頭的程序行為注釋
創建包含多個元素的向量
---包含多個元素的目的是:保存一個變量到R中。----對象名<-R函數
最常用的R函數是C函數,seq,rep,
> holderage<-c(22,22,23,23)
> length(holderage)
[1] 4
> vehiclegroup<-rep("A",each=4)
> vehiclegroup
[1] "A" "A" "A" "A"
> vehiclleage<-seq(from=1,to=4,by=1)
> vehiclleage
[1] 1 2 3 4
> claimamt<-c(2312,2256,1064,1280)
> claimamt
[1] 2312 2256 1064 1280
> nclaims<-c(8,8,4,1)
> nclaims
[1] 8 8 4 1
> str(vehiclegroup)
chr [1:4] "A" "A" "A" "
向量相同,可以使用賦值語句,向量元素相同,可借助重復函數和序列函數簡化書寫
rep重復函數
rep(起始值:終止值,each=重復次數)或times=重復次數
(vehiclegroup<-rep(10:15,times=4))
[1] 10 11 12 13 14 15 10 11 12 13 14 15 10 11 12 13 14 15 10 11 12 13 14 15
> (vehiclegroup<-rep(10:15,each=4))
[1] 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15 15 15
seq序列函數
seq(from=起始值,to =終止值,by=步長)
seq(from=起始值,to =終止值,by=個數)
scan鍵盤數據讀入函數
R支持從鍵盤輸入一組數據到指定向量中,函數書寫:
對象名<-scan()
每個數據間以回車鍵分隔,所有數據輸入完畢后,按住Ctrl+回車鍵表示結束輸入。
Vector創建向量函數
vector(length=元素個數),創建的初值默認為FALSE,需通過向量元素訪問,給各元素賦予具體值
vector(length=5)
[1] FALSE FALSE FALSE FALSE FALSE
訪問向量中為元素
-----訪問指定位置上的元素:
> a<-vector(length=10)
> a
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> a[1]<-1
> a[2:4]<-c(2,3,4)
> a
[1] 1 2 3 4 0 0 0 0 0 0
> b<-seq(from=5,to=9,by=1)
> b
[1] 5 6 7 8 9
> a[5:9,10]<-c(b,10)
Error in a[5:9, 10] <- c(b, 10) : 矩陣里的下標數目不對
> a
[1] 1 2 3 4 0 0 0 0 0 0
> a[c(5:9,10)]<-c(b,10)
> a
[1] 1 2 3 4 5 6 7 8 9 10
-----利用位置向量訪問指定位置上的元素
利用邏輯型位置向量訪問指定位置上的元素,a[b],b的長度不夠a的長度時,按b 先前的順序取值
-------訪問指定元素之外的元素
向量名[-位置常量];訪問除第幾個元素以外的元素
向量名[-位置常量1:位置常量2]
向量名[-c(5:9),10]
向量名[-位置向量名]
用R的矩陣組織數據,
可通過is函數判斷數據對象是否為矩陣。
is.matrix(數據對象名)
2016/09/03 14:07
由向量創建矩陣:
cbind(向量名列表):各向量存儲類型一致
ClaimData<-cbind(holderage,vehiclege,claimamt,nclaims)
dim(矩陣名):顯示矩陣行列數
colnames(ClaimData) : 顯示矩陣各列名稱
colnames(ClaimData [,2:4]) 顯示矩陣指定列名稱
rownames(ClaimData)<-c("1","2","3","4"),給矩陣各行命名
顯示指定行名稱:rownames(Claimdata[c(1,3),])
rbind(a,b) 行合並函數
------------由單個向量派生矩陣
矩陣中的元素已存在於一個向量中
matrix(向量名,nrow=行數,ncol=列數,byrow=TRUE/FALSE,...)
a<-matrix(a,nrow=5,ncol=6,byrow=FALSE,dilnames=list(dim1,dim2));
---------訪問矩陣中的元素:
1)訪問指定位置上的元素
矩陣名[行位置常量,列位置常量]
矩陣名[c(1,2),c(1,3)]
2)訪問指定行上的所有元素
head(矩陣名,n)
tail(矩陣名,n)
3)訪問指定列上的所有元素
4)利用編輯窗口訪問矩陣元素
fix(矩陣名)
---------------------------------------------------------------------------------------------------------------------------------------
數據框用於存儲多個存儲類型不盡相同的變量;
統計 計算機
行:觀測----------記錄
列:變量----------域
判斷數據對象是否為數據框
is.data.frame(數據對象名) TRUE?FALSE
創建數據框
ChaimDataFrm<-data.frame(域名1=向量名1,域名2=向量名2,。。。)
創建數據表時,數據框中是空的,通過:numeric(0)創建一個不包含任何數據的數值型的域。
訪問數據框
(1)矩陣方式訪問
(2)數據框名$域名
數據框名[["域名"]]
數據框名[[域編號]]
還可:
attach(數據框名)
訪問域名函數1
訪問域名函數2
detach(數據框名)
還可:
with(數據框名,{
with(數據框名,{
域訪問函數1
域訪問函數2
})
with內為局部環境,類似C語言里的局部變量。
若修改數據框中的值或增加新的域,需采用within函數
數據框名<-within(數據框名,{
域訪問函數
域修改函數
})
在{ }內生成的新向量均默認加入數據框,成為新的域。
