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(数据框名,{
域访问函数
域修改函数
})
在{ }内生成的新向量均默认加入数据框,成为新的域。