news 2026/6/10 9:52:13

五、更多存储类型(中)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
五、更多存储类型(中)

三、数组 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),dim=c(2,2,2))#, , 1## [,1] [,2]#[1,] "w" "n"#[2,] "i" "d"##, , 2## [,1] [,2]#[1,] "2" "6"#[2,] "0" "7"

为节约篇幅并排除水文的嫌疑,此后数组Array的输出会稍作调整

  • 维度命名-创建时

向dimnames传入一个包含各维度命名向量的列表list

array(c("w","i","n","d",2,0,6,7),dim=c(2,2,2))#, , 1 , , 2# [,1] [,2] [,1] [,2]#[1,] "w" "n" [1,] "2" "6"#[2,] "i" "d" [2,] "0" "7"array(c("w","i","n","d",2,0,6,7),dim=c(2,2,2),dimnames=list(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),dim=c(2,2,2))creator[1,2,2]#[1] "6"creator[-1,2,2]#[1] "7"creator[,,2]# [,1] [,2]#[1,] "2" "6"#[2,] "0" "7"creator[1:1,1:2,1:2]# [,1] [,2]#[1,] "w" "2"#[2,] "n" "6"creator[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),dim=c(2,2,2),dimnames=list(c(1,2),c(1,2),c("name","code")))creator[1,2,"code"]#[1] "6"creator[,,"code"]# 1 2#1 "2" "6"#2 "0" "7"creator[1:1,1:2,c("name","code")]# name code#1 "w" "2"#2 "n" "6"

3. 运算

  • 遍历操作-apply(数组[矩阵也可], ...[附加参数])
参数MARGINFUN
类型integerfunctionundefined
含义应用操作的维度实施操作的函数若函数有多个参数,在此处补充

遍历某个维度的所有向量,对每个向量进行操作 ,结果按该维度的序号顺序拼成矩阵

若MARGIN长度大于1,则遍历对象为MARGIN提供维度数组,结果的顺序为第一维度

code<-array(c(2,0,6,7),dim=c(1,2,2))>code,,1,,2[,1][,2][,1][,2][1,]20[1,]67# 计算每列的和apply(code,MARGIN=2,FUN=sum)#[1] 8 7# 每项加1increase<-function(vec){res<-vector()for(eleinvec)res<-c(res,ele+1)return(res)}# 按第一维度向量、二、三维度矩阵、所有维度三维数列操作apply(code,MARGIN=1,FUN=increase)# [,1]#[1,] 3#[2,] 1#[3,] 7#[4,] 8apply(code,MARGIN=c(1,2),FUN=increase)#, , 1 , , 2# [,1] [,1]#[1,] 3 [1,] 1#[2,] 7 [2,] 8apply(code,MARGIN=c(1,2,3),FUN=increase)#, , 1 , , 2# [,1] [,2] [,1] [,2]#[1,] 3 1 [1,] 7 8

后面两个读起来确实比较费力,读者可以联系前面的表述理解输出格式

4. 模拟

可以用列表的嵌套模拟数组,如此数组的元素可以是更多的数据类型,此处暂略

四、因子 Factor

R语言的因子用于存储离散的、取值有限的数据,如一群人的性别可以用因子存储

因子中数据的取值称为水平level,如上例中因子的水平为"男""女"

1. 创建

  • 根据数据创建因子-factor(向量)
参数levelslabels = levelsordered = Fexclude = NAnmax = NA
类型undefinedvectorlogicalundefinedinteger
含义水平水平命名[标签]水平是否有序排除无效字符水平数上限

不填写levels时,其默认为传入向量的所有不重复元素

若填写,将选择性接收传入值,levels不含有的为NA

factor(c('female','male','female','female','male'))#[1] female male female female male#Levels: male femalefactor(c('female','male','female','female','male'),ordered=T)#[1] female male female female male#Levels: male **<** femalefactor(c('female','male','female','walmatBag','female','male'),exclude="walmatBag")#[1] female male female <NA> female male#Levels: female malefactor(c('female','male','female','walmatBag','female','male'),levels=c("male","female"))#[1] female male female <NA> female male#Levels: male female
  • 水平命名-创建时

使用labels参数命名,顺序与levels一致

注意,此时因子的数据和水平将全部以labels的形式存储

factor(c(0,1,0,0,1),levels=c(1,0),labels=c("male","female"))#[1] female male female female male#Levels: male female

若未显式指定levels参数,其默认顺序为数字、字母从小到大

factor(c(6,7),labels=c("fir","sec"))#[1] fir secfactor(c(2,0),labels=c("fir","sec"))#[1] sec firfactor(c('w','i'),labels=c("fir","sec"))#[1] sec firfactor(c("wi","nd"),labels=c("fir","sec"))#[1] sec firfactor(c("wi","wn"),labels=c("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,length=4)#[1] 1 1 1 2#Levels: 1 2gl(2,3,length=8)#[1] 1 1 1 2 2 2 1 1#Levels: 1 2gl(2,3,labels=c("wind","2067"))#[1] wind wind wind 2067 2067 2067#Levels: wind 2067

2. 访问

因子存储的内容与向量无异,向量的访问方式也适用于因子,结果均为因子

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 7

3. 操作

a) 信息获取

  • 获取水平数-nlevels(因子)
code<-c(2,0,6,7)creator<-factor(code,levels=code,labels=c('w','i','n','d'))nlevels(creator)#[1] 4
  • 获取水平向量-levels(因子)
code<-c(2,0,6,7)creator<-factor(code,levels=code,labels=c('w','i','n','d'))levels(creator)#[1] "w" "i" "n" "d"

若修改该向量,对应因子的水平向量也会改变

creator<-factor(code,levels=code,labels=c('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(),ordered=T))#[1] TRUE
  • 逻辑判断,如是否处于某水平
code<-c(2,0,6,7)creator<-factor(code,levels=code,labels=c('w','i','n','d'))which(creator=="i")#[1] 2

注意,在命名之后水平向量及数据都以labels的形式存储

which(creator==0)#integer(0) 表示未找到

b) 修改数据

  • 置顶某水平-relevel(因子)
参数ref
类型character
含义置顶水平
code<-factor(c(2,0,6,7))#[1] 2 0 6 7#Levels: 0 2 6 7relevel(code,ref=2)#[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,FUN=mean)#[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,length=length(fData)),FUN=sum)#[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(),levels=c(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 < 7

4. 应用

向等长数据载体应用因子,相当于为数据打上了标签,如此就能分组处理数据

支持使用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),ncol=2)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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:48:10

低代码平台崛起:程序员的福音还是威胁

低代码平台崛起:程序员的福音还是威胁关键词&#xff1a;低代码平台、程序员、福音、威胁、软件开发、未来趋势摘要&#xff1a;本文围绕低代码平台崛起这一现象&#xff0c;深入探讨其对程序员而言究竟是福音还是威胁。首先介绍了低代码平台的背景&#xff0c;包括目的、适用读…

作者头像 李华
网站建设 2026/6/5 7:47:40

Conda create环境超时?Miniconda-Python3.10指定国内源解决

Conda create环境超时&#xff1f;Miniconda-Python3.10指定国内源解决 在人工智能项目开发中&#xff0c;你是否曾经历过这样的场景&#xff1a;刚准备开始一个新实验&#xff0c;信心满满地敲下一行命令&#xff1a; conda create -n py310_env python3.10然后——等待。一分…

作者头像 李华
网站建设 2026/6/10 11:29:15

Conda search查找可用包:Miniconda-Python3.10探索新工具

Conda search查找可用包&#xff1a;Miniconda-Python3.10探索新工具 在现代数据科学和人工智能项目的开发中&#xff0c;一个常见的痛点是&#xff1a;为什么同样的代码在同事的机器上能跑通&#xff0c;到了你的环境却报错&#xff1f;问题往往不在于代码本身&#xff0c;而在…

作者头像 李华
网站建设 2026/6/10 11:58:52

本地部署 AI 数据库神器 Chat2DB 并实现外部访问

Chat2DB 是一款免费开源的多数据库客户端工具&#xff0c;这款工具集成了 AI 功能&#xff0c;支持自然语言与 SQL 转换、智能生成 SQL 语句、数据库管理等功能。而且支持 Windows、Mac 本地安装&#xff0c;也支持服务器端部署。 本文将详细的介绍如何利用 Docker 在本地部署 …

作者头像 李华
网站建设 2026/6/10 11:28:56

Windows本地微调大模型全攻略:从零打造你的专属猫娘AI助手

本文详细介绍了作者如何在Windows本地环境中使用unsloth框架对Qwen3-14B模型进行监督微调&#xff0c;通过NekoQA-10K猫娘对话数据集训练&#xff0c;成功创建了一个具有猫娘性格特征的AI助手。文章分享了环境配置、BUG解决及微调全流程&#xff0c;展示了微调后模型的显著变化…

作者头像 李华