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

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

    题目描述 给定N个数的序列和M次询问,每次询问给定左右端点区间中的最大值 输入样例: 6 (N) 34 1 8 123 3 2 4 (M) 1 2 1 5 3 4 2 3 输出样例: 34 123 1 ...

  2. 用Python基于Google Bard做一个交互式的聊天机器人

    用Python基于Google Bard做一个交互式的聊天机器人 之前已经通过浏览器试过了 Google Bard ,更多细节请看: Try out Google Bard, Will Google ...

  3. 最新版本 Stable Diffusion 开源AI绘画工具之部署篇

    目录 AI绘画 本地环境要求 下载 Stable Diffusion 运行启动 AI绘画 关于 AI 绘画最近有多火,既然你有缘能看到这篇文章,那么相信也不需要我过多赘述了吧? 随着 AI 绘画技术的 ...

  4. Vulnhub Bravery靶机 Walkthrough

    Bravery Recon 使用netdiscover对本地网络进行arp扫描. ┌──(kali㉿kali)-[~] └─$ sudo netdiscover -r 192.168.80.0/24 ...

  5. Idea快捷键——查找源码

    双击shift 输入要查找源码类 相当于查 java_jdk_chm Ctrl+F12 :浏览类

  6. pandas操作excle

    Python是一门强大的编程语言,也是数据科学领域中最流行的语言之一.在处理数据时,很多时候需要与Excel进行交互,以进行数据读取.清理和分析.Python中有很多工具可以与Excel进行交互,其中 ...

  7. KK 与答辩

    KK 与答辩 解读一下题:如果在所有场的答辩中,有某个人的总分都要低于kk的总分,就说kk碾压该人 --> 如果在某场答辩中这个人的总分大于kk,那么就说明kk不能碾压该人. 思路就清晰了,我们 ...

  8. Lexicographic Order

    Lexicographic Order (https://codeforces.com/group/L9GOcnr1dm/contest/422381/problem/L) 比较简单的一道题目,主要理 ...

  9. LeetCode SQL 基础题

    链接: 力扣 个人做法: # Write your MySQL query statement below SELECT A.name Employee FROM Employee A,Employe ...

  10. [2]SpinalHDL教程——Scala简单入门

    第一个 Scala 程序 shell里面输入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!&qu ...