由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接。

通常,我们在使用大型数据集时,只会对其中的一小部分感兴趣,用以进行特定分析。 那么,我们应该如何对所有无关的变量和观察值进行排序并仅提取我们需要的那部分数据? 其实,在 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种方法的更多相关文章

  1. python QQTableView中嵌入复选框CheckBox四种方法

    搜索了一下,QTableView中嵌入复选框CheckBox方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简单,通常用这种方法. 第三种只适合静态显示静态数据用 第四 ...

  2. IOS开发中数据持久化的几种方法--NSUserDefaults

    IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...

  3. 从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)

    从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接) 一.总结 一句话总结:最好的是这个:"SELECT * FROM table WHERE id >= (( ...

  4. DELPHI中枚举类型数据的介绍和使用方法

    在看delphi程序的时候看到aa=(a,b,c,d);这样的东西,还以为是数组,同事说是函数,呵呵,当然这两个都不屑一击,原来这样式子是在声明并付值一个枚举类型的数据.下边写下来DELPHI中枚举类 ...

  5. Android数据存储的五种方法汇总

    本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 ...

  6. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  7. Android之数据存储的五种方法

    1.Android数据存储的五种方法 (1)SharedPreferences数据存储 详情介绍:http://www.cnblogs.com/zhangmiao14/p/6201900.html 优 ...

  8. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  9. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

  10. linux中删除文件内空白行的几种方法。

    linux中删除文件内空白行的几种方法 有时你可能需要在 Linux 中删除某个文件中的空行.如果是的,你可以使用下面方法中的其中一个.有很多方法可以做到,但我在这里只是列举一些简单的方法. 你可能已 ...

随机推荐

  1. pychearm日常用法

    一 常用快捷键 编辑类:Ctrl + D             复制选定的区域或行Ctrl + Y           删除选定的行Ctrl + Alt + L     代码格式化Ctrl + Al ...

  2. 理解Java程序的执行

    main 方法 public class Solution { public static void main(String[] args) { Person person = new Person( ...

  3. DeFi4-稳定币

    稳定币--稳定 是一个相对的度量指标 波动性,收益率标准差 在一个时间段内最大跌幅 Fiat,例如: 欧元.英镑的波动率为6-12% (波动本身并不能反映价格的范围 稳定币 vs 锚定币 稳定币类型 ...

  4. 深度学习03-(图像梯度处理、图像轮廓、图像预处理在AI中的应用)

    深度学习03-计算机视觉基本理论2 深度学习03-(计算机视觉基本理论2) 图像梯度处理 什么是图像梯度 模板运算 均值滤波 高斯滤波 中值滤波 边沿检测 锐化 图像轮廓 什么是图像轮廓 查找和绘制轮 ...

  5. 【Linux】文本处理及Shell编程

    1.统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来 [root@CentOS8 ~]# cat /etc/passwd root:x:0 ...

  6. 今日分享:目前目标责任成本明细单价已设置,机构参数设置-物资合同单价超目标责任成本明细单价Y%时不能保存,该参数已设置但未生效是为什么?

    在编制的时候-"材料类别设置"中,不勾选"管控".

  7. map和multimap

    map相对于set区别,map具有键值和实值,所有元素根据键值自动排序,pair的第一个值被称为键值key,pair的第二个值被称为实值value.map也是以红黑树为底层实现机制,根据key进行排序 ...

  8. 2020-09-23:TCP头部信息有哪些?

    福哥答案2020-09-23:#福大大架构师每日一题# 福哥口诀法:T源目序缺首保 紧确推和复同终 窗校紧选数(TCP格式:源端口,目的端口,序号,确认号,首部长度,保留,紧急位URG,确认位ACK, ...

  9. 2021-12-26:给定一个长度为n的数组arr,求有多少个子数组满足 : 子数组两端的值,是这个子数组的最小值和次小值,最小值和次小值谁在最左和最右无所谓。 n<=100000(10^5) n*

    2021-12-26:给定一个长度为n的数组arr,求有多少个子数组满足 : 子数组两端的值,是这个子数组的最小值和次小值,最小值和次小值谁在最左和最右无所谓. n<=100000(10^5) ...

  10. 2021-08-16:回文对。给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。

    2021-08-16:回文对.给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串. 福大大 答案20 ...