R语言数据操纵:如何构建子集

news2024/11/20 7:10:26

目录

向量的子集

矩阵的子集

数据框的子集

列表的子集

如何处理缺失值

向量化操作


构建子集的基本方法:

1.使用[]提取一个或多个类型相同的元素

2.使用[[]]从列表或者数据框中提取元素

3.使用$按名字从列表或数据框中提取元素

向量的子集

比如有一个向量x,他的内容是1到5,我们使用[]+要提取元素的下标可以提取对应的元素,比如要提取第四个元素,他的下标是4,我们就写x[4]

如果要提取前四个元素,就要写x[1:4]

如果要提取向量x中大于3的元素,就要写x[x>3],运行结果如下

实际上x>3这个表达式的运行结果是一个逻辑向量,如图所示

所以x[x>3]提取的是这个表达式结果中对应位置为TRUE的元素

我们还可以使用[]提取要同时满足好几个判断条件的元素,此时需要借助逻辑操作符&和|,他们分别是与操作符和或操作符。

比如我们要提取x中大于2并且小于5的元素

又比如我们要提取x中小于2或者大于4的元素

如果向量的元素已经起了名字,我们还可以直接在[]中写入对应元素的名字来提取对应的元素,注意写名字的时候也要写上双引号。

比如我们给刚才的向量x中每一个元素都起上名字

现在我们要提取第二个元素,就可以写x["b"],运行结果如图,同时显示了这个元素与他的名字。

使用名字来提取子集的方法在很多时候非常有用,因为我们可能并不知道要提取的元素下标是几,但是却知道他的名字。

矩阵的子集

比如有一个两行三列的矩阵如图

现在要提取第二行第三列的元素,可以写成x[2,3],这样6就被提取了出来

如果要提取某一整行的数据,可以这样

只需要把逗号后面的列空着就可以,提取某一列同理,只需要把逗号前面的行空着就可以。

如果要拿到第二行的第一列和第三列元素,可以这样写

有一个问题就是,我们以[]这种方式从矩阵中提取的元素,是向量还是矩阵?这可以通过class函数来验证,如图

显然这已经不是矩阵了,而是一个一维的数据结构类型,可以认为是一个只含一个元素的向量类型。如果我们不希望提取出来的元素变成向量类型,而是仍然保留其矩阵类型的性质,可以在使用[]提取元素的时候增加一个参数drop,如图

此时提取元素的运行结果就变成了矩阵性质的数据结构,可以认为是一个一行一列的矩阵。这在有些情况下是有用的,因为有的函数要求参数类型必须是矩阵类型。

数据框的子集

比如有这样一个数据框x

数据框构建子集的方式与矩阵由很多相似之处,比如提取某一列的方法都是在逗号后面加要提取的列

也可以使用要提取的列的列名

我们当然可以直接使用第几行第几列这种方式来唯一确定要提取的元素,但由于我们还在创建数据框的同时给数据框的每个元素都命名了,因此还可以单独提取数据框每个元素的子集,比如x$v1就拿到了名为v1的这一列,此时x$v1就是一个向量了,是一个一维的数据结构,x$v1[3]就可以提取x$v1这个向量的第三个元素,当然也可以提取其第一第二个元素。x$v1[c(1,2)],如图

提取v1这一列小于4并且v2这一列大于等于8的行,列不做要求,可以这样写

确实是只有第三行满足要求。其中前面的条件表示v1这一列小于4的行,而后面的条件是v2这一列大于等于8的行,同时成立的就只有第三行。

再比如提取v1中大于2的行,发现第3 4 5行都满足条件。

如果在判断条件之前加上一个which,会发生什么?

我们发现结果和上面的居然是一样的。那么which这个函数是做什么的呢?which的作用其实是给出哪些位置是真。我们可以单独运行一下which这一句

如果直接运行这个判断条件,结果是这样

因此which返回的其实是向量中为TRUE的那些元素的下标

提取到子集之后,我们还可以对子集进行操作,比如把提取到的子集赋值为NA

此时数据框就变成了这样

实际上R语言中提供了专门构建子集的函数subset,他需要至少两个参数,一个是原始的数据集,一个是筛选子集的条件。

列表的子集

构建列表的子集使用的是[[]],$,[[]][],[[]][[]]等,相对于数据框或者矩阵子集的构建要更麻烦一些。因为可能会涉及到嵌套列表或者不完全匹配的情况

比如我们先创建这样一个列表

提取列表中第一个元素可以使用下标或者对应元素的名字,如图

我们发现用只用一个[]拿到的是列表中某个元素的名字和内容,如果我们想要只拿到某个元素的内容而不包括他的名字,应该使用嵌套的方括号[[]],比如

也可以使用$符号,如图

当然也可以借助c函数提取列表中的多个元素

介绍一个容易用错的点,如果我们先把id赋给y

这样是可以提取到某一行内容的,但是如果用$符号,就无法提取到某一行的内容

如图,虽然此时的y中放的是id,但仍然无法使用$提取到列表x某一个元素的内容

也就是说使用$符号的对象只能是列表直接的名字,而不能是被赋值为列表名字的变量。

如何从列表中获取嵌套的元素?就比如有这样一个列表

列表中有两个元素,第一个元素是一个列表,第二个元素是一个向量

假如我们想要拿到第一个元素也就是那个列表中的2,应该怎么做?

前面已经说过嵌套的[]能够拿到不含列表元素名字的内容,也就是说我们写x[[1]]就拿到了第一个列表,那么要再拿到这个列表中的某个元素内容,只需要再次使用一个嵌套的[]即可,如图

表示拿到了x列表中第一个元素(也就是列表a)中的第二个元素的内容。当然如果要同时拿到嵌套列表的名字,就在拿到嵌套列表的基础上使用一个[]即可

实际上要拿到列表中嵌套的某个数据结构的内容,还有一种更简单的方式,就是借助c函数。如图

这两句代码分别表示想要拿到列表x中第一个元素的第二个元素,想要拿到列表x第二个元素的第一个元素,这样的写法拿到的均为元素内容而不包括这些元素的名字

列表中的不完全匹配

假如有这样一个列表,它包含一个元素,这个元素是一个名为qwer的向量

那么我们如果想要拿到这个向量内容,当然可以使用$符号加上这个向量的名字,而在实际操作中我们发现即使只有这个名字的第一个字母,也能够正确的提取到这个向量的内容,如图

这种现象被称为列表的不完全匹配。

上面是使用$符号的方式,再来看看直接使用[[]]是否也存在不完全匹配

我们发现也是存在的,但是需要把参数exact设置成FALSE

注意如果一个列表中有好几个元素的名字第一个字母都相同,就会对使用不完全匹配造成一定影响,比如一个元素名叫a,还有一个元素名叫asaaxfg,那么在使用不完全匹配的时候就只能使用as

如何处理缺失值

先创建一个包含缺失值的向量x

is.na函数可以用来判断向量中有无缺失值,这个函数会在对应下标为缺失值的位置返回TRUE,而不是缺失值的位置返回FALSE,如果要提取x中非缺失值的元素,只需要在is.na结果前面加一个!即可

有时候还需要提取两个向量对应下标位置均不是缺失值的元素,如图

这时候就要借助函数complete.cases函数,他的返回值仍然是一堆逻辑值,只有在传入的两个向量对应下标均非缺失值的时候才返回TRUE

complete.cases函数的返回值可以让我们方便的提取x和y中对应位置都不是缺失值的元素,就是从上帝视角来看,把这些向量一个个堆好,某一列中都没有缺失值的元素,如图

再来看一个比较复杂的例子,我们加载R中自带的一个数据集datasets

airquality是datasets中的某个子集,使用head函数可以查看他的前六行。在以后会经常见到这样的表格,其中每一行叫做一个记录,每一列叫做一个变量,所以这里展示了六个变量的六个记录。

complete.cases返回值是一个非常长的逻辑向量,值为TRUE的代表数据框airquality中没有缺失值的行

利用complete.cases的返回值这个逻辑向量可以非常便捷的提取出没有缺失值的行,提取的时候对列没有做要求,表示要看这六个变量的情况,如图

要查看这个数据框的前10行,可以这样

向量化操作

用一个例子来解释什么是向量化操作

现在x和y均为向量,我们想要得到另一个向量,这个向量里面存放的内容是x和y两个向量下标相同位置的元素之和,如果是在C语言中,我们需要借助循环,但是在R中,直接写x+y即可,运行之后就是对应位置相加的结果

对应下标位置作乘法或者除法同理

如果是矩阵呢?

比如我创建了x和y两个矩阵,在创建y矩阵的时候我是用了rep函数,表示把2重复四次,因此y矩阵的内容是4个2

此时来看这两个矩阵加法或者乘法的结果

发现使用这种方法做的矩阵乘法其实是对应位置的元素相乘,我们知道真正的矩阵乘法不是这样的,而应该是乘行乘列,要做真正的矩阵乘法,应该使用运算符%*%,如图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1570361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssm基于面向对象的学生事务处理系统分析与设计论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本学生事务处理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

java算法day44 | 动态规划part06 ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包理论基础 完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。 体现在代码中就是对背包的遍历顺序不同。01背包是逆序遍历背包,完全背包是顺序遍历背包。 518. 零钱兑换 II class Solution {public int change(int amount, int[] coin…

银行业架构网络BIAN (Banking IndustryArchitecture Network)详细介绍

BIAN ( The Banking Industry Architecture Network) 是一个业界多方协作的非营利性组织,由全球领先银行、技术提供商、顾问和学者组成,定义了一个用以简化和标准化核心银行体系结构的银行技术框架。这一框架基于面向服务的架构 (SOA) 原则,银…

Everything搭建http服务器

突然发现everything还可以搭建http服务器,给大家分享一下 打开everything,按图示填写或选择内容 在浏览器输入你的本地地址和端口 再输入刚才设置的账户密码,即可使用

产品推荐 | 中科亿海微推出亿迅®A8000金融FPGA加速卡

01、产品概述 亿迅A8000金融加速卡,是中科亿海微联合金融证券领域的战略合作伙伴北京睿智融科,将可编程逻辑芯片与金融行业深度结合,通过可编程逻辑芯片对交易行情加速解码,实现低至纳秒级的解码引擎,端到端的处理时延…

Integer.parseInt和Integer.valueOf区别

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Integer.parseInt多…

传输层 --- TCP (下篇)

目录 1. 超时重传 1.1. 数据段丢包 1.2. 接收方发送的ACK丢包 1.3. 超时重传的超时时间如何设置 2. 流量控制 3. 滑动窗口 3.1. 初步理解滑动窗口 3.2. 滑动窗口的完善理解 3.3. 关于快重传的补充 3.4. 快重传和超时重传的区别 4. 拥塞控制 4.1. 拥塞控制的宏观认识…

Mysql安装(命令方式安装)

下载mysql压缩包 Mysql可以使用界面安装,也可以使用命令的方式安装,今天我们使用命令的方式安装mysql。首先下载mysql压缩包(下载地址:https://dev.mysql.com/downloads/mysql/),解压到你想要安装的目录。 …

C++相关概念和易错语法(3)(类的声明和定义、空指针分析、this指针)

1.类的声明和定义 注意类的声明和定义分离的时候,在定义处要使用域作用限定符,否则函数声明链接时的定位不到函数的定义。 这些成员变量、函数的作用于这个类域,将功能集成在一起,这体现出封装的思想。 在区分类的定义和声明时&…

C# WPF编程-元素绑定

C# WPF编程-元素绑定 将元素绑定到一起绑定表达式绑定错误绑定模式代码创建绑定移除绑定使用代码检索绑定多绑定绑定更新绑定延时 绑定到非元素对象Source属性RelativeSource属性DataContent属性 数据绑定是一种关系,该关系告诉WPF从源对象提取一下信息,…

深度学习pytorch实战第P2周:CIFAR10彩色图片识别

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 零、引言(温故而知新&#xff…

什么是ICMP协议,如何防护ICMP攻击

一.什么是ICMP ICMP(Internet Control Message Protocol)是互联网控制报文协议,是TCP/IP协议族的一个子协议。它主要用于在IP网络中传递控制信息和错误消息,是IP协议的补充。ICMP协议是一种无连接协议,它不需要建立…

SambaNova 芯片:深入解析其架构和高性能秘诀

SambaNova——一家总部位于帕洛阿尔托的公司已经筹集了超过10亿美元的风险投资,不会直接向公司出售芯片。相反,它出售其定制技术堆栈的访问权限,该堆栈具有专门为运行最大的人工智能模型而设计的专有硬件和软件。 最近,SambaNova…

MySQL - 基础三

11、事务管理 CURD不加控制,会有什么问题? 当客户端A检查还有一张票时,将票卖掉,还没有执行更新数据库时,客户端B检查了票数,发现大于0,于是又卖了一次票。然后A将票数更新回数据库。这是就出现…

面经分享(Flask,轻量级Web框架)

1. Flask的核心特点 a. 轻量级:核心简洁,只提供了基本的功能,其他高级功能可以通过插件或扩展来添加。 b. 灵活性:允许开发者选择适合自己项目的组件和工具,没有强制的项目结构和设计模式。 c. 易于扩展:提…

OPPO VPC 实践探索

01 概述 一年前(20年6月),OPPO云网络技术底座开始支持VPC方案,解决了用户担心的云上安全和虚拟实例的性能问题。我们称这个版本为VPC1.0,其采用了先进的智能网卡加速和VXLAN隧道隔离技术,实现了VPC从无到有的突破。 然而由于业务快…

FreeRtos入门-3 信号量(计数值、二进制、互斥量、递归锁)

信号量 计数量 二进制 互斥量 递归锁 创建 xSemCalc xSemaphoreCreateCounting(10, 0);//计数最大值10,初始值0 xSemUart xSemaphoreCreateBinary(); xSemUART xSemaphoreCreateMutex(); xSemUART xSemaphoreCreateRecursiveMutex(); 释放 xSemaphore…

mysql 判断一张表是否存在的方法

查询表是否存在 使用 SHOW TABLES SHOW TABLES LIKE %tbl_tabl%;结果: 查询 INFORMATION_SCHEMA // like 匹配 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA test AND TABLE_NAME like %tbl%; // 完全匹配 SELECT TABLE_NAME FROM INFORMATION_SC…

JVM基础二——类的生命周期

加载阶段 : 连接阶段: 初始化阶段: 总结:

C++ | Leetcode C++题解之第10题正则表达式匹配

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isMatch(string s, string p) {int m s.size();int n p.size();auto matches [&](int i, int j) {if (i 0) {return false;}if (p[j - 1] .) {return true;}return s[i - 1] p[j - 1];};vector<…