R语言中的常用数据结构
目录
R对象的基本类型
R对象的属性
R的数据结构
向量
矩阵
数组
列表
因子
缺失值NA
数据框
R的数据结构总结
R语言可以进行探索性数据分析,统计推断,回归分析,机器学习,数据产品开发
R对象的基本类型
R语言对象有五种基本类型,分别是字符,数值,整数,复数,逻辑
你可能有疑问,整数也好,复数也好,不都是数值吗?为什么要分成好几种类型呢?可以看这个例子

class函数用来查看某个变量的类型,同样的一个数3.14.如果不加L,就是数值型,加上L就是整数型,这个了解即可
R对象的属性
前面介绍的类型是R对象的某一种属性,除了类型之外,R还有名称,维度(比如矩阵或者数据框的几行几列),长度等等属性。
R的数据结构
向量
向量用于存放一组类型相同的数据,有点像C语言中的数组
向量的创建可以使用vector函数
![]()
这样就创建了一个向量,长度是十个字符,内容均为空字符,因为我们在前面创建的时候没有初始化

也有更便捷的创建方式如

这样就生成了一个1到4的向量

这种方式虽然便捷,但是只能创建等差的数据
创建向量还可以使用c函数,比如

这样就创建了这样一个向量

使用c函数创建向量的好处在于可以随意地输入我们想要的内容
可以看见使用c函数和直接1:4创建的向量一个是数值型一个是整数型,不比在意这个差异,这个差异并不会造成什么影响。
我们说向量只能用来存放一组相同类型的数据,因此我们在用c函数创建向量的时候如果给了不同类型的数据,比如
![]()
那么R其实并不会直接报错,而是会自动把他们强制转换成相同类型的元素

可以看到这里R就自动把我们输入的三个不同类型的数据都转换成了字符类型。这种转换是隐式的。不需要我们再单独用指令去完成。实际上R语言中也有单独的强制类型转换的函数,就是as.某类型,比如

运行结果如图

这是因为R不知道如何把a,b,c三个字符转换成数值型,因此使用了缺失值NA来填充
R的属性还有名称,因此我们可以给创建的向量中每个元素起一个名字,使用的是names函数,比如

运行结果如图

这代表前三个元素的名字分别为first,second,third
矩阵
矩阵有两个维度,即行和列,矩阵中的元素必须是相同类型的元素
矩阵也可以存放多个元素,实际上可以把矩阵当做一个向量+维度
创建矩阵可以使用函数matrix,matrix函数至少需要两个参数即nrow和ncol,分别代表行数和列数,比如

这样就创建了一个三行两列的元素,由于我们并没有在创建的时候对矩阵内容进行初始化,因此矩阵内容均以缺失值填充,如图

我们当然也可以在创建的同时对矩阵进行赋值,比如

这样就把矩阵内容初始化成了1到6,默认是竖着初始化的

查看矩阵的维度(其实就是行和列)可以使用函数dim,如图

这个函数在查看巨大的矩阵时非常的方便。
我们前面提到过矩阵其实就是向量+维度,根据这个思路,我们只需要给某个向量一个维度信息,就构成了一个矩阵,比如

y是一个向量,dim(y)表示y的维度信息,我们主动给这个维度信息赋值为3和2,表示y有三行两列,运行之后结果如图

一个三行两列的矩阵就创建完成了,内容填充使用的是向量y的内容
合并两个矩阵的方法
合并两个矩阵就要考虑是按行进行合并还是按列进行合并
比如现在要把图中的y和z两个矩阵拼接起来

如果是按行拼接,就是这样

如果是按列拼接,就是这样

前面介绍了可以给向量的每个元素起名字,R当然也可以给矩阵元素的行和列都起名字,使用的函数是dimnames,由于对矩阵的行和列进行命名的时候需要用到列表,因此具体的代码等到后面学完列表再展示
数组
数组与矩阵非常类似,区别在于矩阵的维度只能是2,也即行和列,但是数组的维度可以大于2,也可以等于2,如果创建数组的时候使用的维度是2,那么此时的数组和矩阵没有任何区别。
创建数组需要的是数组的维度以及初始化数组的内容,创建数组使用的是函数array,其中dim参数在传入的时候通常要使用c函数拼接,比如

运行结果如图,我们创建了一个四行六列的数组,这与矩阵没有任何区别

再来看看创建的时候给dim三个维度会发生什么,注意维度的乘积一定要和初始化内容的个数匹配,比如我们初始化的内容给了1到24,后面维度就是2*3*4=24。如

运行结果如图

可以看到结果是两个逗号再加一个数,这个数代表的就是第三个维度,然后我们可以看到有四个矩阵,这表示第三个维度里面一共有四个元素,每个元素都是一个两行三列的矩阵。同时注意到我们赋值给的数据1到24,是先填充第三个维度的第一个元素也就是这个两行三列的矩阵,然后是第三个维度的第二个元素以此类推。
R中最常用的数据结构其实是向量,矩阵,数据框,对于数组应用的并不多,了解即可。
列表
列表与矩阵的区别就是矩阵中所有元素都必须是同一类型,而列表只需要每一列是同一类型即可,不同列之间可以是不同类型的数据,且每一列的元素个数不一定相同
创建列表使用的函数是list,如图

运行结果如图,发现结果有点复杂,有一个东西是两个中括号引起来的,还有一个东西是一个中括号引起来的。其中两个中括号引起来的表示这是列表中的第几个元素,一个中括号的是列表中元素的维度情况。不管列表有多复杂,他的元素个数只与逗号有关
列表中有四个元素,第一个元素的内容只有一个a,第二个元素的内容只有一个1

如果这样创建

列表中就有两个元素,第一个元素的内容是1 2 3,第二个元素的内容是a b c

再比如这样

创建的列表仍然是两个元素,第一个元素的内容是一个两行两列的矩阵,第二个元素的内容是一个向量。
这种由两个中括号表示的虽然也是列表的第几个元素,但是看起来挺抽象的,我们其实可以再创建列表的时候给列表每个元素起个名字,比如

我们把第一个元素起名为a,第二个元素起名为b,运行结果如下

表示元素a是一个两行两列的矩阵,元素b是一个向量。这样可读性就好了很多。
发现没,其实可以把列表理解成一个进阶版的向量,他并不是一个高维的数据结构,而是一个一维的,但是他的每个元素的类型可以是任意维度的,比如向量,矩阵,数据框。
现在来填一下对矩阵的行和列进行命名的坑,对矩阵或者数组的行和列进行命名的函数是dimnames,如图

首先创建了一个列表,这个列表有两个元素,第一个元素是一个向量,内容是a b c,第二个元素也是一个向量,内容是d e,而对一个矩阵的行和列进行命名,也就是需要这么两个向量。运行结果如图

因子
因子是用来处理分类数据的,分类数据分为有序的和无序的。比如年级有大一大二大三,这就是有序的,再比如性别有男有女,他们无法比较大小,这就是无序的。可以把因子理解成整数型向量+标签,比如可以让1代表男性,2代表女性。但是因子肯定要优于整数向量,因为因子的可读性较好,这就好比C语言中的宏,或者枚举类型的好处。如果我们直接写成1,2可能过一段时间就忘记了这个1和2代表什么,但是如果我们写成因子类型,就可以一眼看出描述的是什么意思。因子这种数据结构是在以后做线性或非线性模型中经常要用到的。
因子类型的创建

如图,因子类型的创建使用的是factor函数,运行之后发现结果是一行向量再加一个levels,表示当前的因子包含两个水平,分别是female和male,levels是因子的特有属性。
如果我们在factor函数里面加入第二个参数levels,如图

发现运行结果如图

和不加入levels参数的区别就是levels的位置先后
如果我们想要对当前的因子有一个整体的认识,可以使用table函数

运行结果表示当前因子中有三个male两个female。
我们说levels是因子独有的属性,我们其实也可以对因子进行去属性,借助的函数是unclass函数,如图

运行结果发现现在这个因子的元素变成了1 1 2 1 2,实际上就是1代表male,2代表female
缺失值NA
在R中,缺失值有两种表示形式,一种是NA,一种是NaN,其中NaN属于NA,一般NaN用于表示数字的缺失值,而NA的表示类型更广。如果要判断一个向量中是否存在缺失值,可以使用is.na()函数或者is.nan函数,返回值是TRUE或者FALSE,如图

运行结果如图

我们发现is.nan的结果居然全都是FALSE,这也印证了NA不属于NAN,如果我们对上面的a向量做一些改变,把缺失值写成NaN

此时的运行结果为

这就说明了NaN是属于NA的,而NA不属于NaN。
数据框
数据框通常用来存放表格数据,每一列的元素必须相同,不同列的元素可以不同。实际上数据框就是一种特殊的列表,数据框的每一列都是这个列表的一个元素,且因为数据框的每一列长度相同,所以这个列表的所有元素都是一个个长度相同的向量。这些向量的包含元素的类型不必相等。且这些向量包含元素的个数也就是每一列的长度
换句话说,数据框是一种每个元素都是相同长度向量的列表。
创建数据框使用的是函数data.frame,这个函数的参数就是每一列的内容,我们可以在创建的同时对每一列进行命名,如图

运行结果为

顺便提一下,如果不在创建数据框的同时进行命名,也是没有语法错误的,只不过创建出来的数据框是这样的

非常的难看,因此强烈建议再创建数据框的同时对每一列进行命名。
R的数据结构总结
R的对象类型有五种,分别是字符型,数值型,整数型,复数型,逻辑型
常用的数据结构有向量,矩阵,数组,列表,因子,数据框。其中后面几种数据结构都是基于向量的,比如向量+两个维度就构成了矩阵,加两个以上的维度就构成了数组,不同类型的向量可以构成列表,如果这些含有不同元素类型的向量的长度均相同,就构成了数据框,整数型向量加标签就是因子。
创建各种数据结构使用的函数:
创建向量:1.vector函数 2.使用冒号 3.使用c函数
创建矩阵:matrix函数
创建列表:list函数
创建因子:factor函数
创建数据框:data.frame函数
相关文章:
R语言中的常用数据结构
目录 R对象的基本类型 R对象的属性 R的数据结构 向量 矩阵 数组 列表 因子 缺失值NA 数据框 R的数据结构总结 R语言可以进行探索性数据分析,统计推断,回归分析,机器学习,数据产品开发 R对象的基本类型 R语言对象有五…...
基于Python的微博旅游情感分析、微博舆论可视化系统
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
机器学习的模型校准
背景知识 之前一直没了解过模型校准是什么东西,最近上班业务需要看了一下: 模型校准是指对分类模型进行修正以提高其概率预测的准确性。在分类模型中,预测结果通常以类别标签形式呈现(例如,0或1)…...
0.17元的4位数码管驱动芯片AiP650,支持键盘,还是无锡国家集成电路设计中心某公司的
推荐原因:便宜的4位数码管驱动芯片 只要0.17元,香吗?X背景的哦。 2 线串口共阴极 8 段 4 位 LED 驱动控制/7*4 位键盘扫描专用电路 AIP650参考电路图 AIP650引脚定义...
【C++】编程规范之内存规则
在高质量编程中,内存管理是一个至关重要的方面。主要有以下原则: 内存分配后需要检查是否成功:内存分配可能会失败,特别是在内存紧张的情况下。因此,在分配内存后,应该检查分配是否成功。 int* ptr new …...
并发编程之线程池的应用以及一些小细节的详细解析
线程池在实际中的使用 实际开发中,最常用主要还是利用ThreadPoolExecutor自定义线程池,可以给出一些关键的参数来自定义。 在下面的代码中可以看到,该线程池的最大并行线程数是5,线程等候区(阻塞队列)是3,即…...
基于JSP的农产品供销服务系统
背景 互联网的迅猛扩张彻底革新了全球各类组织的运营模式。自20世纪90年代起,中国的政府机关和各类企业便开始探索利用网络系统来处理管理事务。然而,早期的网络覆盖范围有限、用户接受度不高、互联网相关法律法规不完善以及技术开发不够成熟等因素&…...
redis之主从复制、哨兵模式
一 redis群集有三种模式 主从复制: 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。 主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。 缺陷: 故障恢复无法自动化&…...
【随笔】Git 基础篇 -- 分支与合并 git rebase(十)
💌 所属专栏:【Git】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…...
图像识别技术在体育领域的应用
图像识别技术在体育领域的应用是一个充满创新和挑战的研究方向。随着计算机视觉和人工智能技术的快速发展,图像识别技术已经在体育领域展现出广泛的应用潜力和实际价值。以下是一些图像识别技术在体育领域的具体应用: 运动员表现分析: 图像识…...
【项目新功能开发篇】开发编码
作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是࿰…...
软件设计原则:开闭原则
定义 开闭原则(Open-Closed Principle, OCP)是面向对象设计的基本原则之一,由 Bertrand Meyer 提出。它指出软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着软件应该设计成在不修改现有代…...
Python如何下载视频
大家好,今天我将为大家介绍如何使用Python来下载视频。Python作为一门强大的编程语言,不仅可以用于数据分析、机器学习等领域,还能用于网络爬虫和视频下载等任务。下面我将详细介绍如何使用Python来下载视频。 首先,我们需要明确…...
使用虚拟引擎为AR体验提供动力
Powering AR Experiences with Unreal Engine 目录 1. 虚拟引擎概述 2. 虚拟引擎如何为AR体验提供动力 3. 虚拟引擎中AR体验的组成部分是什么? 4. 使用虚拟引擎创建AR体验 5. 虚拟引擎中AR的优化提示 6. 将互动性融入AR与虚拟引擎 7. 在AR中…...
Kafka入门到实战-第五弹
Kafka入门到实战 Kafka常见操作官网地址Kafka概述Kafka的基础操作更新计划 Kafka常见操作 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://kafka.apache.org/Kafka概述 Apache Kafka 是一个开源的分布式事件流平台&…...
Ideal Holidays
题目链接 AtCoder Beginner Contest 347 C - Ideal Holidays 思路: 一周有 A B AB AB 天,前 A A A 天放假,问能不能把所有工作放进节假日里。 先看简单的,两个。其实我们并不是很在乎它们中间隔了多少天,我们只…...
Raven:一款功能强大的CICD安全分析工具
关于Raven Raven是一款功能强大的CI/CD安全分析工具,该工具旨在帮助广大研究人员对GitHub Actions CI工作流执行大规模安全扫描,并将发现的数据解析并存储到Neo4j数据库中。 Raven,全称为Risk Analysis and Vulnerability Enumeration for C…...
【苹果MAC】苹果电脑 LOGI罗技鼠标设置左右切换全屏页面快捷键
首先键盘设置->键盘快捷键 调度中心 设置 f1 f2 为移动一个空间(就可以快捷移动了) 想要鼠标直接控制,就需要下载官方驱动,来设置按键快捷键,触发 F1 F2 安装 LOGI OPTIONS Logi Options 是一款功能强大且便于使用…...
IDE/VS2015和VS2017帮助文档MSDN安装和使用
文章目录 概述VS2015MSDN离线安装离线MSDN的下载离线MSDN安装 MSDN使用方法从VS内F1启动直接启动帮助程序跳转到了Qt的帮助网页 VS2017在线安装MSDN有些函数在本地MSDN没有帮助?切换中英文在线帮助文档 概述 本文主要介绍了VS集成开发环境中,帮助文档MS…...
开启 Keep-Alive 可能会导致http 请求偶发失败
大家好,我是蓝胖子,说起提高http的传输效率,很多人会开启http的Keep-Alive选项,这会http请求能够复用tcp连接,节省了握手的开销。但开启Keep-Alive真的没有问题吗?我们来细细分析下。 最大空闲时间造成请求…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
