2026/4/1 7:04:18
网站建设
项目流程
网站建设公司专业开发北京网站,网站开发的资料设备,如何制作h5页面视频,长春建站价格三、数组 Array先前的向量Vector和矩阵Martrix只支持一维和二维的运算#xff0c;为支持更高更灵活维度的运算#xff0c;R语言引入了和其他语言类似的数组(Array)类型1. 创建
创建数组#xff0d;array(向量)参数dim lengh(向量)dimnames NULL类型vectorlist含义各维度长…三、数组 Array先前的向量Vector和矩阵Martrix只支持一维和二维的运算为支持更高更灵活维度的运算R语言引入了和其他语言类似的数组(Array)类型1. 创建创建数组array(向量)参数dim lengh(向量)dimnames NULL类型vectorlist含义各维度长度各维度命名需要满足length(向量) prod(dim)而后按照维度从前到后填充(行 → 列 → 第三维 → …)其他与矩阵Matrix类似不多赘述看示例array(c(w,i,n,d,2,0,6,7),dimc(2,2,2))#, , 1## [,1] [,2]#[1,] w n#[2,] i d##, , 2## [,1] [,2]#[1,] 2 6#[2,] 0 7为节约篇幅并排除水文的嫌疑此后数组Array的输出会稍作调整维度命名创建时向dimnames传入一个包含各维度命名向量的列表listarray(c(w,i,n,d,2,0,6,7),dimc(2,2,2))#, , 1 , , 2# [,1] [,2] [,1] [,2]#[1,] w n [1,] 2 6#[2,] i d [2,] 0 7array(c(w,i,n,d,2,0,6,7),dimc(2,2,2),dimnameslist(c(1,2),c(1,2),c(name,code)))#, , name , , code# 1 2 1 2#1 w n 1 2 6#2 i d 2 0 7更高维度的默认命名为, , 3维取值, 4维取值, ..., n维取值前两个,取值的缺省表示打印了当前缺省组合所有内容如, ,表示打印了前两维度所有内容同理[,i]表示当前列打印了该列所有内容2. 访问同样地数组Array支持用[1维取值, 2维取值, ..., n维取值]来访问元素、低阶分块、同阶分块a) 用索引访问creator-array(c(w,i,n,d,2,0,6,7),dimc(2,2,2))creator[1,2,2]#[1] 6creator[-1,2,2]#[1] 7creator[,,2]# [,1] [,2]#[1,] 2 6#[2,] 0 7creator[1:1,1:2,1:2]# [,1] [,2]#[1,] w 2#[2,] n 6creator[1:1,1:2,c(1,1)]# [,1] [,2]#[1,] w w#[2,] n n在访问低阶分块时数据依旧保持原先的维度顺序如例中2、3维的数据各对应结果中1、2维b) 用命名访问creator-array(c(w,i,n,d,2,0,6,7),dimc(2,2,2),dimnameslist(c(1,2),c(1,2),c(name,code)))creator[1,2,code]#[1] 6creator[,,code]# 1 2#1 2 6#2 0 7creator[1:1,1:2,c(name,code)]# name code#1 w 2#2 n 63. 运算遍历操作apply(数组[矩阵也可], ...[附加参数])参数MARGINFUN…类型integerfunctionundefined含义应用操作的维度实施操作的函数若函数有多个参数在此处补充遍历某个维度的所有向量对每个向量进行操作 结果按该维度的序号顺序拼成矩阵若MARGIN长度大于1则遍历对象为MARGIN提供维度数组结果的顺序为第一维度code-array(c(2,0,6,7),dimc(1,2,2))code,,1,,2[,1][,2][,1][,2][1,]20[1,]67# 计算每列的和apply(code,MARGIN2,FUNsum)#[1] 8 7# 每项加1increase-function(vec){res-vector()for(eleinvec)res-c(res,ele1)return(res)}# 按第一维度向量、二、三维度矩阵、所有维度三维数列操作apply(code,MARGIN1,FUNincrease)# [,1]#[1,] 3#[2,] 1#[3,] 7#[4,] 8apply(code,MARGINc(1,2),FUNincrease)#, , 1 , , 2# [,1] [,1]#[1,] 3 [1,] 1#[2,] 7 [2,] 8apply(code,MARGINc(1,2,3),FUNincrease)#, , 1 , , 2# [,1] [,2] [,1] [,2]#[1,] 3 1 [1,] 7 8后面两个读起来确实比较费力读者可以联系前面的表述理解输出格式4. 模拟可以用列表的嵌套模拟数组如此数组的元素可以是更多的数据类型此处暂略四、因子 FactorR语言的因子用于存储离散的、取值有限的数据如一群人的性别可以用因子存储因子中数据的取值称为水平level如上例中因子的水平为男、女1. 创建根据数据创建因子factor(向量)参数levelslabels levelsordered Fexclude NAnmax NA类型undefinedvectorlogicalundefinedinteger含义水平水平命名[标签]水平是否有序排除无效字符水平数上限不填写levels时其默认为传入向量的所有不重复元素若填写将选择性接收传入值levels不含有的为NAfactor(c(female,male,female,female,male))#[1] female male female female male#Levels: male femalefactor(c(female,male,female,female,male),orderedT)#[1] female male female female male#Levels: male **** femalefactor(c(female,male,female,walmatBag,female,male),excludewalmatBag)#[1] female male female NA female male#Levels: female malefactor(c(female,male,female,walmatBag,female,male),levelsc(male,female))#[1] female male female NA female male#Levels: male female水平命名创建时使用labels参数命名顺序与levels一致注意此时因子的数据和水平将全部以labels的形式存储factor(c(0,1,0,0,1),levelsc(1,0),labelsc(male,female))#[1] female male female female male#Levels: male female若未显式指定levels参数其默认顺序为数字、字母从小到大factor(c(6,7),labelsc(fir,sec))#[1] fir secfactor(c(2,0),labelsc(fir,sec))#[1] sec firfactor(c(w,i),labelsc(fir,sec))#[1] sec firfactor(c(wi,nd),labelsc(fir,sec))#[1] sec firfactor(c(wi,wn),labelsc(fir,sec))#[1] fir sec根据水平重复创建因子gl(水平数, 重复数)generate factorlevels参数length n * klabels levelsordered F类型integervectorlogical含义因子长度水平命名[标签]水平是否有序length参数的优先级高于重复数gl(2,3)#[1] 1 1 1 2 2 2#Levels: 1 2gl(2,3,length4)#[1] 1 1 1 2#Levels: 1 2gl(2,3,length8)#[1] 1 1 1 2 2 2 1 1#Levels: 1 2gl(2,3,labelsc(wind,2067))#[1] wind wind wind 2067 2067 2067#Levels: wind 20672. 访问因子存储的内容与向量无异向量的访问方式也适用于因子结果均为因子code-c(2,0,6,7)creator-factor(code)# numericcreator[1]#[1] 2#Levels: 0 2 6 7# logicalcreator[c(T,F,T,F)]#[1] 2 6#Levels: 0 2 6 73. 操作a) 信息获取获取水平数nlevels(因子)code-c(2,0,6,7)creator-factor(code,levelscode,labelsc(w,i,n,d))nlevels(creator)#[1] 4获取水平向量levels(因子)code-c(2,0,6,7)creator-factor(code,levelscode,labelsc(w,i,n,d))levels(creator)#[1] w i n d若修改该向量对应因子的水平向量也会改变creator-factor(code,levelscode,labelsc(w,u,n,d))creator#[1] w u n d#Levels: w u n dlevels(creator)-c(c(w,i,n,d))creator#[1] w i n d#Levels: w i n d判断因子是否有序is.ordered(因子)is.ordered(factor(c(),orderedT))#[1] TRUE逻辑判断如是否处于某水平code-c(2,0,6,7)creator-factor(code,levelscode,labelsc(w,i,n,d))which(creatori)#[1] 2注意在命名之后水平向量及数据都以labels的形式存储which(creator0)#integer(0) 表示未找到b) 修改数据置顶某水平relevel(因子)参数ref类型character含义置顶水平code-factor(c(2,0,6,7))#[1] 2 0 6 7#Levels: 0 2 6 7relevel(code,ref2)#[1] 2 0 6 7#Levels: 2 0 6 7重新排序水平reorder(因子x, 排序向量X)参数FUN meanorder is.ordered(x)类型functionlogical含义操作函数结果因子是否有序要求排序向量长度与因子数据长度一致排序向量每个元素对应一个水平于是此时每个水平将获得这些元素组成的向量水平根据向量经操作函数处理的结果升序排序# 实际问题1: 根据平均身高排序地区region-c(A,A,B,C,B)height-c(1.6,1.7,1.8,1.7,1.9)fRegion-factor(region)reorder(fRegion,height,FUNmean)#[1] A A B C B#attr(,scores)# A B C#1.65 1.85 1.70#Levels: A C B# 实际问题2: 根据数据量排序水平fData-factor(c(2,0,6,0,6,7,2,6,7))reorder(fData,rep(1,lengthlength(fData)),FUNsum)#[1] 2 0 6 0 6 7 2 6 7#attr(,scores)#0 2 6 7#2 2 3 2#Levels: 0 2 7 6删除未使用的水平droplevels(因子)empty-factor(c(),levelsc(2,0,6,7))empty#factor()#Levels: 2 0 6 7droplevels(empty)#factor()#Levels:有序转化as.order(因子)code-factor(c(2,0,6,7))#[1] 2 0 6 7#Levels: 0 2 6 7as.ordered(code)#[1] 2 0 6 7#Levels: 0 2 6 74. 应用向等长数据载体应用因子相当于为数据打上了标签如此就能分组处理数据支持使用list()组合多个因子此时只有这些因子都对应相同的数据才能分为一组按因子拆分数据split(数据载体, 因子)fTag-factor(c(1,2,1,3,1))data-c(2,0,6,7,6)split(data,fTag)#$1#[1] 2 6 6##$2#[1] 0##$3#[1] 7按因子应用函数[向量]tapply(向量, 因子, 函数)相当于在分组的基础上对组向量施加操作函数结果为表格# 使用上例的数据计算组均值tapply(data,fTag,mean)# 1 2 3#4.666667 0.000000 7.000000按因子应用函数[矩阵]by(矩阵, 因子, 函数)因子将作用于行# 分组后计算组内列均值mat-matrix(c(2,0,6,7,6,7,2,0),ncol2)mat# [,1] [,2]#[1,] 2 6#[2,] 0 7#[3,] 6 2#[4,] 7 0fTag-factor(c(1,0,1,1))by(mat,fTag,colMeans)#INDICES: 0#V1 V2# 0 7#---------------------------------------#INDICES: 1# V1 V2#5.000000 2.666667