在R中子集化数据框的5种方法
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接。
通常,我们在使用大型数据集时,只会对其中的一小部分感兴趣,用以进行特定分析。 那么,我们应该如何对所有无关的变量和观察值进行排序并仅提取我们需要的那部分数据? 其实,在 R 中有几种被称为 “subsetting(子集化)” 的方法可以满足以上的需求,今天我们来聊一下。
在 R 中对数据框(data frame)进行子集化的最基本方法是使用方括号:
example[x, y]
example 是我们想要从中提取子集的数据框;’x’ 是我们想要提取的子集的行;’y’ 是我们想要提取的子集的列。 让我们从网上提取一些数据,看看它是如何在真实的数据集上实现的。
### import education expenditure data set and assign column names
education <- read.csv("https://vincentarelbundock.github.io/Rdatasets/csv/robustbase/education.csv", stringsAsFactors = FALSE)
colnames(education) <- c("X","State","Region","Urban.Population","Per.Capita.Income","Minor.Population","Education.Expenditures")
head(education, 25)
这是我导入数据并适当命名其列后数据集的第一部分(前 25 行):

现在,让我们假设回顾一下美国中西部的学校分布,并且我们需要计算 Region 2 地区中每个州每个孩子花费了多少钱。 我们需要三个变量:State,Minor.Population 和 Education.Expenditures。 但是,我们只需要对应于 Region 2 的行的观察结果。这是在 R 中检索该数据的基本方法:
ed_exp1 <- education[c(10:21), c(2, 6:7)]
为了创建新的数据框 ‘ed_exp1’,我们通过提取第 10-21 行和第 2, 6 和 7 列来对 “education(教育)” 数据框进行子集化。非常简单,对吧?
使用括号对数据框进行子集化的另一种方法是省略行和列引用(即反取)。 看看这段代码:
ed_exp2 <- education[-c(1:9, 22:50),-c(1, 3:5)]
在这行代码里,我们不是对我们想要返回的行和列进行子集化,而是对我们不希望返回的行和列进行子集化,然后使用 “-” 符号省略它们。 如果我们现在调用 ed_exp1 和 ed_exp2,我们可以看到两个数据框都返回原始 education 数据框相同的子集。


上面这些在 R 中对小数据框进行子集的基本方法在大型数据集中会变得单调缺乏灵活性,因为我们必须知道所要提取的子集的确切列和行索引号。如果一个数据只有 7 列 50 行,找到所需的列和行会非常简单,但是如果这个数据有 70 列和 5000 行呢?在这种情况下,如何找到所需的列和行?下面是另一种在 R 中提取数据框子集的方法。
ed_exp3 <- education[which(education$Region == 2), names(education) %in% c("State", "Minor.Population", "Education.Expenditures")]
我们来看看这段命令发生了什么。
首先,我们使用了跟前两个例子一样的方括号技术来提取 education 数据框的子集。但是,这一次,我们使用了 which() 函数提取我们需要的行。 此函数返回了 education 数据框中 Region 列值为 2 的索引。这为我们提供了所需的行。
然后,我们通过在 education 数据框的名称上使用 %in% 运算符来检索子集的列。
现在,有些人看着这行代码觉得它太复杂了。 必须有一种更简单的方法来做到这一点。 好吧,你会是对的。 R 中还有另一个基本功能,它允许我们在不知道行和列引用的情况下对数据框进行子集化。 使用名字来提取? 你猜对了:subset()。
ed_exp4 <- subset(education, Region == 2, select = c("State","Minor.Population","Education.Expenditures"))
subset() 函数有 3 个参数:我们想要子集化的数据框,我们希望它进行子集化处理对应的行,以及我们想要返回的列。 在我们的例子中,我们采用 “Region” 等于 2 的 education 子集,然后选择 “State”, ”Minor.Population” 和 “Education.Expenditure” 列。
当我们使用上述两种方法中的任何一种对 education 数据框进行子集化时,我们得到与前两种方法相同的结果:


除此以外,还有一种我们操作数据最有用的方法。让我们先来看看代码,然后我们将讨论它。
install.packages("dplyr")
library(dplyr)
ed_exp5 <- select(filter(education, Region == 2),c(State,Minor.Population:Education.Expenditures))
最后的这一种方法不是 R 基础环境的一部分。要使用它,我们必须安装并下载 dplyr 软件包。如果你要使用 R 中的数据,这肯定是一个你想要的包。 它是 R 环境中下载次数最多的软件包之一,当你开始使用它时,你很快就会明白为什么。
因此,一旦我们下载了 dplyr,我们就可以使用此包中的两个不同函数创建一个新的数据框:
filter:第一个参数是数据框; 第二个参数是我们希望它被子集化的条件。 结果是整个数据框只有我们想要的行。
select:第一个参数是数据框; 第二个参数是我们想要从中选择的列的名称。我们不必使用 names() 函数,甚至不必使用引号。 我们只是将列名列为对象就可以。
在这个例子中,我们将筛选函数(filter)包装在选择函数(select)中以返回我们的数据框。 换句话说,我们首先将 Region 为 2 的行作为子集。 然后,我们从那些行中获取了我们想要的列。 结果为我们提供了一个数据框架,其中包含我们感兴趣的 12 个州所需的数据:

最后,回顾一下,这里有 5 种方法可以在 R 中对数据框进行子集化:
使用括号,通过提取我们想要的行和列来进行子集化;
使用括号,通过省略我们不想要的行和列来进行子集化;
使用括号,使用
which()函数和%in%运算符组合进行子集化;使用
subset()函数;使用
dplyr包中的filter()和select()函数实现数据框子集化。

本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
在R中子集化数据框的5种方法的更多相关文章
- python QQTableView中嵌入复选框CheckBox四种方法
搜索了一下,QTableView中嵌入复选框CheckBox方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简单,通常用这种方法. 第三种只适合静态显示静态数据用 第四 ...
- IOS开发中数据持久化的几种方法--NSUserDefaults
IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...
- 从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)
从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接) 一.总结 一句话总结:最好的是这个:"SELECT * FROM table WHERE id >= (( ...
- DELPHI中枚举类型数据的介绍和使用方法
在看delphi程序的时候看到aa=(a,b,c,d);这样的东西,还以为是数组,同事说是函数,呵呵,当然这两个都不屑一击,原来这样式子是在声明并付值一个枚举类型的数据.下边写下来DELPHI中枚举类 ...
- Android数据存储的五种方法汇总
本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- Android之数据存储的五种方法
1.Android数据存储的五种方法 (1)SharedPreferences数据存储 详情介绍:http://www.cnblogs.com/zhangmiao14/p/6201900.html 优 ...
- JAVA中获取文件MD5值的四种方法
JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
- linux中删除文件内空白行的几种方法。
linux中删除文件内空白行的几种方法 有时你可能需要在 Linux 中删除某个文件中的空行.如果是的,你可以使用下面方法中的其中一个.有很多方法可以做到,但我在这里只是列举一些简单的方法. 你可能已 ...
随机推荐
- 在已有的vue项目中添加单元测试模块
package.json 添加新命令 "test": "jest",下载包: "jest": "^26.6.3", &q ...
- jQuery绑定方法
流程/*** * 1.文件命名 * jquery.banner.1.0.0.js * jquery.banner.js * 2.添加匿名函数 * (function(){})() * 3.给插件前后添 ...
- 2023年php面试题
Php面试题 1.isset和empty的区别? Isset测试变量是否被赋值,如果这个变量没被赋值,则返回false,empty是判断变量是否为空,当赋值为0,null,'',返回true为真.他们 ...
- 介绍一下js垃圾回收机制
JavaScript中的垃圾回收机制负责自动管理内存,回收不再使用的对象所占用的内存空间.在JavaScript中,开发者不需要显式地分配和释放内存,垃圾回收器会自动完成这些操作.以下是关于JavaS ...
- mysql中innodb_open_files限制导致数据库异常重启
问题描述:收到监控软件告警,提示数据库发生重启,进去查看,截止到6/27 10:00 之前,作为主节点的orch1先重启,然后故障转移到orch2和orch3节点上.在持续到6/27 9:00 左右, ...
- Nvidia Tensor Core初探
1 背景 在基于深度学习卷积网络的图像处理领域,作为计算密集型的卷积算子一直都是工程优化的重点,而卷积计算一般转化为矩阵乘运算,所以优化矩阵乘运算自然成为深度学习框架最为关心的优化方向之一.鉴于此,N ...
- redhat中如何设置开机启动脚本
redhat中如何设置开机启动脚本 前面转载了一篇关于开机启动脚本的文章,觉得写的很详细了,但是自己没有实践,下面是自己实践了一种方式,来设置开机启动脚本(因为有时候我们必须开机关闭一些防火墙,SEL ...
- 一文理解TS泛型
当我们在编写 TypeScript 代码时,经常会遇到需要通用(Generic)的情况,这时候,泛型就是我们的好帮手了.在本篇文章中,我们将深入介绍 TypeScript 泛型的概念以及如何使用. 什 ...
- iOS APP启动广告实现方式 与 APP唤端调用
APP启动广告功能实现要从2个方面思考 一是UI方案,怎样处理广告页与主页之间的切换方式. 二是广告页展示时机,是使用后台实时广告数据还是使用本地缓存广告数据.后台数据方式获取广告最新但是用户要等待后 ...
- 数据结构(DataStructure)-01
数据结构-01 **数据结构与算法** **算法概述** **时间复杂度概述** **时间复杂度 - 计算规则** **数据结构概述** **抽象数据类型** **线性表 - 顺序表** **线性表 ...