R语言之 dplyr 包

news2025/2/28 17:17:38

文章和代码已经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。

文章目录

  • 1.使用 filter( ) 和 slice( ) 筛选行
  • 2.使用 arrange( ) 排列行
  • 3. 使用 select( ) 选择列
  • 4.使用 mutate( ) 添加新变量
  • 5.使用 summarise( ) 计算统计量
  • 6. 使用 group_by( ) 拆分数据框
  • 7. 使用传递符 %>% 组合多个操作
  • 项目实战

这个包以一种统一的规范更高效地处理数据框。dplyr 包里处理数据框的所有函数的第一个参数都是数据框名。

下面以 MASS 包里的 birthwt 数据集为例,介绍 dplyr 包里常用函数的用法。该数据集来自一项关于新生儿低体重危险因素的病例对照研究。首先加载该数据集并查看其相关信息。

library(dplyr)
data(birthwt, package = "MASS")
# ??birthwt

数据集 birthwt 里一共包含 189 个研究对象、10 个变量。其中结果变量 bwt 是新生儿的体重(单位:g),变量 low 是将 bwt 的取值以 2500g 为分点转换成的一个二分类变量。其余 8 个变量均为预测变量,包括孕妇的年龄(age)、种族(race)、吸烟状况(smoke)、高血压史(ht)等。

1.使用 filter( ) 和 slice( ) 筛选行

函数 filter() 可以基于观测值筛选数据框的一个子集。第一个参数是数据框名,第二个参数以及随后的参数是用来筛选数据框的表达式。

例如,筛选数据框里年龄大于 35 岁的对象的所有记录:

filter(birthwt, age > 35)

函数 filter ( ) 里可以用逗号分隔多个条件。使用下面的命令将会选择选择年龄大于 35 岁,并且出生体重小于 2500g 或者大于 4000g 的所有记录,因为记录较多,这里只显示了前 10 行。

head(filter(birthwt, age > 35, bwt < 2500 | bwt > 4000),10)

函数 slice( ) 可以按照行号选择指定的行。例如,下面的命令选择数据集里面的第 2 行到第 5 行。

slice(birthwt, 2:5)

2.使用 arrange( ) 排列行

有时候我们想要将数据框的记录按照某个变量进行排序,函数 arrange() 可以实现这个功能。下面的命令将数据框按照变量 bwt 的值从小到大进行排序后显示:

arrange(birthwt, bwt) # 默认升序

在上面的输出中,第 6 行和第 7 行的变量 bwt 的值都是 1588,在这种情况下如果还想将数据框按照第二个变量排序,只需要在函数 arrange( ) 里加上第二个变量即可。例如,下面的命令将数据框按照变量 bwt 的值从小到大排序,在 bwt 取值相等的情况下再按照第二个变量 age 的值从小到大排序。

arrange(birthwt, bwt, age)

如果想把数据框按照某个变量的值从大到小进行排序,可以借助函数 desc( ) 实现。

arrange(birthwt, desc(bwt))
# 等价于
arrange(birthwt, - bwt)

3. 使用 select( ) 选择列

函数 select( ) 用于选择数据框中的列(变量)。

# 下面的命令选择数据框里面的 bwt、age、race 和 smoke 这 4 个变量组成新的数据框。
select(birthwt, bwt, age, race, smoke)

请注意,MASS 包里有一个同名函数 select( ),如果同时加载了 dplyr 包和 MASS 包,R 会默认使用较后加载的包里的函数。为了避免混淆,我们可以使用符号 :: 特别指明使用某一个包里的函数,例如 dplyr::select( )。之后我们将会对函数 select( ) 作进一步介绍。

4.使用 mutate( ) 添加新变量

函数 mutate( ) 用于在数据框中创建新的变量。下面的命令将数据集 birthwt 里的变量 lwt(单位:lb)乘以系数 0.4536 后生成新的变量 lwt.kg(1lb ≈ 0.4536kg)。

# 当然如果想要用新变量替换原来的变量,只需把新变量命名为原来的变量名:
mutate(birthwt, lwt.kg = lwt*0.4536)

5.使用 summarise( ) 计算统计量

函数 summarise( ) 可以用于计算数据框中某个变量的指定统计量。

例如,计算变量 bwt 的样本均值和样本标准差:

summarise(birthwt, Mean.bwt = mean(bwt), Sd.bwt = sd(bwt))

6. 使用 group_by( ) 拆分数据框

函数 group_by( ) 可以将数据框按照某一个或某几个分类变量拆分成多个数据框。例如:

group_by(birthwt, race)
str(group_by(birthwt, race))

# ============ 输出 =============
grouped_df [189 × 10] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ low  : int [1:189] 0 0 0 0 0 0 0 0 0 0 ...
 $ age  : int [1:189] 19 33 20 21 18 21 22 17 29 26 ...
 $ lwt  : int [1:189] 182 155 105 108 107 124 118 103 123 113 ...
 $ race : int [1:189] 2 3 1 1 1 3 1 3 1 1 ...
 $ smoke: int [1:189] 0 0 1 1 1 0 0 0 1 1 ...
 $ ptl  : int [1:189] 0 0 0 0 0 0 0 0 0 0 ...
 $ ht   : int [1:189] 0 0 0 0 0 0 0 0 0 0 ...
 $ ui   : int [1:189] 1 0 0 1 1 0 0 0 0 0 ...
 $ ftv  : int [1:189] 0 3 1 2 0 0 1 1 1 0 ...
 $ bwt  : int [1:189] 2523 2551 2557 2594 2600 2622 2637 2637 2663 2665 ...
 - attr(*, "groups")= tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ race : int [1:3] 1 2 3
  ..$ .rows: list<int> [1:3] 
  .. ..$ : int [1:96] 3 4 5 7 9 10 15 16 18 20 ...
  .. ..$ : int [1:26] 1 17 29 30 31 33 35 41 43 70 ...
  .. ..$ : int [1:67] 2 6 8 11 12 13 14 19 21 24 ...
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE

函数 group_by( ) 不会改变数据框的外观,而会改变它与其他 dplyr 动词函数的作用方式 。因此,上面的输出结果看上去和原来的数据框没有什么差别,但实质上是不同的。最本质的差别是多了一个分组属性(Groups),即上面的结果包含了 3 个数据框,分别对应于变量 race 的 3 个类别。

你还可能注意到上面输出对象的格式(grouped_df [189 × 10] (S3: grouped_df/tbl_df/tbl/data.frame))。与 R/Rstudio 上不同,notebook 这里把它显示成了 A grouped_df: 189 × 10(而非 # A tibble: 189 x 10),实际它仍然包含 tibble(注意其中的 - attr(*, "groups")= tibble [3 × 2] (S3: tbl_df/tbl/data.frame))。另外,它没有显示 Groups 属性信息,实际应为 # Groups: race [3]

tibble 是 tidyverse 系列包(包括 dplyr 包)提供的一种类似数据框的格式。相对于传统的数据框,tibble 在很多方面具有优势,感兴趣的读者可以参阅函数 tibble( ) 的帮助文档。我们可以用函数 as_tibble( ) 将传统的数据框转换为 tibble,也可以用函数 as.data.frame( ) 将 tibble 转换成传统的数据框。

as_tibble(birthwt)

下面我们将会看到,把函数 group_by( ) 和 summarise( ) 联合使用能方便地对变量进行分组统计。

7. 使用传递符 %>% 组合多个操作

我们经常需要对一个数据框做一系列的操作,后面一个操作的输入需要用前一个操作的输出结果。

# 第一步把数据框 birthwt 里面的变量 race 转换成因子并给各个水平添加标签,把新的数据框命名为 birthwt1
birthwt1 <- mutate(birthwt, 
                   race = factor(race, labels = c("white", "black", "other")))
# 第二步把数据框 birthwt1 按照变量 race 分组,把分组后的对象命名为 birthwt.group; 
birthwt.group <- group_by(birthwt1, race)
# 第三步对于分组对象 birthwt.group 计算各组中变量 bwt 的平均值。
summarise(birthwt.group, mean(bwt))

这种方法的最大缺点是需要为每个中间结果建立一个变量。在很多情况下,比如在上面的示例中,这些中间变量其实是没有什么实际意义的。我们需要给这些中间变量命名,而且这些中间变量会保存在工作空间中占用内存。传递操作符 %>% 将该符号之前的对象传递给符号后面的函数并作为函数的第一个参数值。例如:

c(2, 4, 6, 8) %>% matrix(nrow = 2)

因为 dplyr 包里面的函数第一个参数总是数据框,所以这些函数配合传递操作符处理数据框非常方便。下面用传递操作符改写上面的命令:

birthwt %>%
  mutate(race = factor(race, labels = c("white", "black", "other"))) %>%
  group_by(race) %>%
  summarise(mean(bwt))

上述代码的重点在于动词函数,而不是函数中的参数。在阅读这一串代码组合时,可以将它们当成一系列的规定动作。

项目实战

epiDisplay 包里的数据集 Planning 来自 20 世纪 80 年代中期泰国的一项计划生育调查研究,请通过其帮助文件查看数据信息并整理该数据集。

library(epiDisplay)
data(Planning)
print(des(Planning))

names(Planning) <- tolower(names(Planning))   # 把变量名变为小写字母
summary(Planning)

table(duplicated(Planning$id))       # 查看是否有重复id;
# FALSE  TRUE 
#   250     1
which(duplicated(Planning$id))       # 找出重复id的行号;把 XXXXXX 替换成正确的代码
#   216
Planning$id # 验证下
Planning$id[216] <- 216  # 修正重复id;

library(dplyr)
Planning <- mutate(
  Planning,
  relig = ifelse(relig == 9, NA, relig),     # 将变量relig中的9变成NA
  ped = ifelse(ped == 0 | ped == 9, NA, ped), # 将变量ped中的0和9变成NA
  income = ifelse(income == 9, NA, income),   # 将变量income中的9变成NA
  am = ifelse(am == 99, NA, am),           # 将变量am中的99变成NA
  reason = ifelse(reason == 9, NA, reason),  # 将变量reason中的9变成NA
  bps = ifelse(bps == 0 | bps == 999, NA, bps), # 将变量bps中的0和999变成NA
  bpd = ifelse(bpd == 0 | bpd == 999, NA, bpd), # 将变量bpd中的0和999变成NA
  wt = ifelse(wt == 0 | wt > 99, NA, wt),    # 将变量wt中的0和大于99的值变成NA
  ht = ifelse(ht == 0 | ht > 300, NA, ht)    # 将变量ht中的0和大于300的值变成NA;
)

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

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

相关文章

FMCW雷达基于时分复用波形(TDMA) 3D点云获取方法的仿真

摘要&#xff1a;通过设置时分复用(TDMA)波形结合FMCW毫米波雷达仿真获取目标的距离、速度和方位角3D点云信息。在本案例中&#xff0c;首先通过发射天线交替发射FMCW波形并通过接收天线依次接收回波信号从而得到雷达原始数据&#xff0c;其次对获取的原始数据依次经行距离、速…

电脑怎么把视频转换gif动图?视频生成gif的操作步骤

如果你也想把一些精彩的视频转gif图片&#xff08;https://www.gif.cn&#xff09;的话&#xff0c;今天的文章你可千万不要错过&#xff0c;利用专业的视频转gif工具&#xff0c;轻松在线视频转gif&#xff0c;操作简单又方便&#xff0c;支持电脑、手机双端操作&#xff0c;赶…

金蝶云星空和管易云接口打通对接实战

金蝶云星空和管易云接口打通对接实战 对接系统金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用框架等&#xff0c;有效支持企业的运…

静电中和风机在所具有的的优点

半导体生产过程中&#xff0c;静电积聚和离子污染是常见的问题&#xff0c;会对产品质量和工艺稳定性造成负面影响。为了解决这个问题&#xff0c;可以采用专门用于半导体自动化的静电消除/中和离子风机。 静电消除/中和离子风机是一种集静电消除和离子中和功能于一体的装置。…

Arnold置乱

一、Arnold置乱概述 Arnold变换是俄国数学家弗拉基米尔阿诺德&#xff08;Vladimir Igorevich Arnold&#xff09;提出&#xff0c;Arnold将其应用在遍历理论研究中。由于Arnold本人最初对一张猫的图片进行了此种变换&#xff0c;因此它又被称为猫脸变换&#xff08;cat映射&am…

24 | 紧跟时代步伐:微服务模式下API测试要怎么做?

微服务架构&#xff08;Microservice Architecture&#xff09; 微服务是一种架构风格。在微服务架构下&#xff0c;一个大型复杂软件系统不再由一个单体组成&#xff0c;而是由一系列相互独立的微服务组成。其中&#xff0c;各个微服务运行在自己的进程中&#xff0c;开发和部…

【pdf密码】PDF文件,无密码取消限制

PDF文件设置了限制编辑&#xff0c;会导致什么情况呢&#xff1f;比较常见的就是无法编辑、无法复制粘贴、无法打印或者打印文件清晰度差。这些都是PDF限制编辑导致的&#xff0c;想要编辑文件&#xff0c;我们就需要取消限制编辑&#xff0c;但是有些时候&#xff0c;大家可能…

静电中和设备在半导体自动化生产中起到了怎样的作用

静电中和设备在半导体自动化生产中起到了重要的作用。在半导体生产过程中&#xff0c;由于材料的摩擦、粉尘的飞扬、人员的移动等原因&#xff0c;会产生大量的静电电荷。这些静电电荷如果不得到有效的中和处理&#xff0c;会对生产过程和产品质量产生严重的影响。 静电中和设…

LPC1768运行threadx数组越界导致出现硬件错误死机问题的排查

移植了threadx后运行发现程序莫名跑飞&#xff0c;停留在 HardFaultHandler 即硬件错误异常 调试过程中发现在汇编启动文件启动后跳转main函数即刻就发生了错误异常&#xff0c;先排除是在操作系统运行过程中的问题&#xff0c;而且是硬件错误异常所以先对导致改错误的可能进行…

ENSP操作平台命令汇总一(第五课)

一 Ensp基础指令操作 1 ipconfig 查看 pc机的IP地址2 ping 连接的IP地址 3 system-view 进入系统视图4 [Huawei]interface GigabitEthernet 0/0/1 进入接口视图 过0/0/15 quit 返回上一层视图6 ctrlZ 快速返回用户视图7 [sy]sysname tedu-ntd-lswl 进入系统视…

Java --- 内部类

目录 一、什么是内部类 二、为什么需要内部类 三、内部类的分类 3.1、成员内部类 3.2、局部内部类 四、练习 一、什么是内部类 将一个类A定义在另一个类B里面&#xff0c;里面的那个类A就称为内部类&#xff08;InnerClass&#xff09;&#xff0c;类B则称为外部类&#…

SQL 错误 [22007]: ERROR: invalid input syntax for type date: ““

0. 背景 PG数据库一张表有这样一个varchar类型的字段end_date,存储的值是格式化后的年月日日期如 2024-08-10 现在我需要根据当前日期与end_date的差值作为where条件过滤,我的写法 select …… from my_table_name where current_date - cast (end_date as date) >100报错…

苹果“迎难而上”,印度赚印度花,扩大产能,推动手机制造业发展

根据报道&#xff0c;苹果公司在由印度当地媒体 Business Today 报道的会议中表示&#xff0c;他们计划扩大在印度的生产产能。这也进一步显示了苹果对印度市场的重视程度。 据统计数据显示&#xff0c;印度已成为苹果第五大iPhone市场&#xff0c;其市场营收超越了法国和德国&…

React绑定antd输入框,点击清空或者确定按钮实现清空输入框内容

其实实现原理和vue的双向绑定是一样的&#xff0c;就是监听输入框的onChange事件&#xff0c;绑定value值&#xff0c;当输入框内容发生变化后&#xff0c;就重新设置这个value值。 示例代码&#xff1a;我这里是统一在handleCancel这个函数里面处理清空逻辑了&#xff0c;你们…

再写CentOS7升级OpenSSL-1.0.1U

本文在CentOS7.4以及TencentOS 2.4上测试通过。 原系统自带OpenSSL 1.0.2k-fips。 编译安装方法跟之前的没啥区别。 从官网下载1.0.1u版https://www.openssl.org/source/ 使用tar解包 tar xfz openssl-1.0.1u.tar.gz 依次执行如下&#xff1a; cd openssl-1.0.1u ./con…

pdf转ppt软件哪个好用?推荐一个好用的pdf转ppt软件

在日常工作和学习中&#xff0c;我们经常会遇到需要将PDF文件转换为PPT格式的情况。PDF格式的文件通常用于展示和保留文档的原始格式&#xff0c;而PPT格式则更适合用于演示和展示。为了满足这一需求&#xff0c;许多软件提供了PDF转PPT的功能&#xff0c;使我们能够方便地将PD…

成都优优聚做美团代运营还有市场吗?

成都优优聚公司是一家专注于美团代运营的企业。作为美团的第三方代运营商&#xff0c;公司致力于帮助商家提升线上形象&#xff0c;提高销售额&#xff0c;实现转型升级。在与美团合作的多年间&#xff0c;公司已积累了丰富的经验和优秀的专业团队。 作为一个代运营商&#xff…

VK0192是标准LCD显示面板/液晶显示屏驱动芯片(IC)-24SEG×8COM

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK0192 封装形式&#xff1a;LQFP44 概述 VK0192是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大192点&#xff08;24SEGx8COM&#xff09; 的LCD屏。单片机可通过3/4线串行接口配置显示参数和发送显示数据…

恢复照片软件,记好这几个,照片恢复很简单!

“我真的很喜欢拍摄各种各样的照片&#xff0c;然后在电脑上进行修图。但是吧&#xff01;我比较马虎&#xff0c;在挑选照片时经常会误删一些很好看的照片。真的很需要一款专门恢复照片的软件&#xff0c;想问问有什么好的推荐吗&#xff1f;” 无意中删除了重要的照片真的会让…

GE 8920-PS-DC安全模块

安全控制&#xff1a; 这个安全模块通常用于实现工业自动化系统中的安全控制功能。它可以监测各种安全参数&#xff0c;如机器运动、温度、压力等&#xff0c;以确保系统在安全范围内运行。 PLC兼容性&#xff1a; 通常&#xff0c;这种安全模块可以与可编程逻辑控制器&#x…