R语言学习笔记之高效数据操作

一、概要

数据操作是R语言的一大优势,用户可以利用基本包或者拓展包在R语言中进行复杂的数据操作,包括排序、更新、分组汇总等。R数据操作包:data.tabletidyfst两个扩展包。

data.table是当前R中处理数据最快的工具,可以实现快速的数据汇总、连接、删除、分组计算等操作,具有稳定、速度快、省内存、特性丰富、语法简洁等特点。由于其函数语法结构相对来说较为抽象,对于初学者而言往往需要花更多的时间来掌握。

tidyfst包应运而生,用以提高data.table代码的可读性和可维护性。tidyfst包参考了tidyverse体系的语法结构,让用户能够见名知义;同时,其底层由data.table代码构成,因此实现速度非常快。对于较为复杂的data.table操作,tidyfst包提供了简便的调用函数进行实现。

资料来源:《机器学习全解(R语言版)》 黄天元  2024年7月出版

二、数据读写

在data.table包中可以使用freadfwrite函数对csv格式的文件进行读写。

如果需要保存规模较大的数据,可以使用tidyfst包的import_fstexport_fst函数来进行数据读写,其数据保存格式为以fst为扩展名的二进制文件。它的特点就是数据高保真读写速度快压缩效果好,因此保存下来的fst文件往往要比csv格式占用内存更小

library(pacman)
p_load(tidyfst,data.table)

fwrite(iris,"D:/iris.csv")
ir=fread("D:/iris.csv")

export_fst(iris,"D:/iris.fst")
ir=import_fst("D:/iris.fst")

三、筛选列

1、选择需要的列

library(pacman)
p_load(tidyfst,data.table)
ir=as.data.table(iris)
ir

# 选取上面构造的数据框ir中的第1、3和4列,以下两种写法等价
ir %>% select_dt(1,3,4)    #tidyfst
ir[,c(1,3,4)]    # data.table

2、选择连续的列

可以使用“:”符号:

# 选择1到3列
ir %>% select_dt(1:3) 
ir[,1:3]

 3、根据变量名称选择单列

# 选择Sepal.Length列
ir %>% select_dt(Sepal.Length)
ir[,"Sepal.Length"]

4、根据变量名称选择多列

变量名称之间需要用逗号隔开 

# 选择Sepal.Length和Petal.Length两列
ir %>% select_dt(Sepal.Length,Petal.Length)
ir[,c("Sepal.Length","Petal.Length")]

5、根据正则表达式筛选列

# 选择列名称包含“Sepal”的列
ir %>% select_dt("Sepal")
ir[,.SD,.SDcols=patterns("Sepal")]

 

6、利用特殊函数选择列

# 选择数据类型为因子的列
ir %>% select_dt(is.factor)
ir[,.SD,.SDcols = is.factor]

7、排除列

排除一些列,则可以在原来基础上加上减号来实现:

# 排除Sepal.Length和Petal.Length这两列
ir %>% select_dt(-Sepal.Length,-Petal.Length)
ir[,-c("Sepal.Length","Petal.Length")]

# 排除因子列
ir %>% select_dt(-is.factor)
ir[,.SD,.SDcols = -is.factor]

四、筛选行

1、根据单个条件筛选行

# 筛选出Sepal.Length大于7的条目
ir %>% filter_dt(Sepal.Length>7)
ir[Sepal.Length>7]

2、多条件筛选行

如果要附加多个条件,那么条件之间可以利用逻辑运算符&(与)​、|(或)和!(非)进行修饰和连接。

# 筛选Species列不为versicolor且Sepal.Length大于6的条目
ir %>% filter_dt(Species != "versicolor" & Sepal.Length > 6)
ir[Species != "versicolor" & Sepal.Length > 6]

3、tidyfst包中现成的筛选函数

slice_max_dt

获得Sepal.Length最大的10个条目

ir %>% slice_max_dt(Sepal.Length,10)

slice_min_dt

获得Sepal.Length最小的10个条目

ir %>% slice_min_dt(Sepal.Length,10)

slice_sample_dt

随机选择10个条目

ir %>% slice_sample_dt(10)

slice_dt

根据条目的位置来进行筛选。获得ir数据框的第100行

ir %>% slice_dt(100)ir[100]

选择多行,则可以使用数值向量。选出第100行到第105行

ir %>% slice_dt(100:105)ir[100:105]
unique

去重

ir %>% unique()

 

 

五、更新

更新是指对数据框的一列或多列进行修饰,或根据已有列构造新列。

mutate_dt新增常数列、修改列
mutate_when按照一定的条件进行列的更新
mutate_vars对多个列同时进行原位修饰
ir %>% mutate_dt(one=1)
ir %>% mutate_dt(Sepal.Length=Sepal.Length+1)
ir %>% mutate_when(Sepal.Width=0.2,one=1)
ir %>% mutate_vars("^Petal",function(x) x-1)

1、新增一列名为one的常数列,其所有数值均为1

2、让Sepal.Length列的所有数值加1

3、在Petal.Width等于0.2的时候新增名为one的常数列

4、让列名称以Petal开头的列都减去1

六、排序

对数据框进行排序有两种方法,一种是按照行进行排序,另一种是按照列进行排序。

arrange_dt按列排序
relocate_dt调整列的位置
ir %>% arrange_dt(Sepal.Length)
ir[order(Sepal.Length)]

ir %>% arrange_dt(Sepal.Length,Sepal.Width)
ir[order(Sepal.Length,Sepal.Width)]

ir %>% arrange_dt(-Sepal.Length)
ir[order(-Sepal.Length)]

ir %>% relocate_dt(Species,how="first")
ir %>% relocate_dt(Species,how="last")

ir %>% relocate_dt(Petal.Length,how = "after",where = Petal.Width)


# 对列的位置进行重新排列
new_order=names(ir)[c(3,2,4,5,1)]
new_order
ir[,.SD,.SDcols = new_order]

# 直接写上列名称
ir %>% select_mix(Petal.Length,
                  Sepal.Width,
                  Petal.Width,
                  Species,
                  Sepal.Length)

1、按照Sepal.Length列从小到大进行排列

多列:先按照Sepal.Length列进行排列,然后再按照Sepal.Width列进行排列

2、从大到小进行排列,在原来的变量之前加入负号

3、调整列的位置

把Species列放到第一列:

把Sepal.Length列放到最后一列:

七、汇总

汇总的过程是用较少信息表征较多信息的方法。

tidyfst包中使用summarise_dt函数来对数据框中的列进行汇总。

ir %>% summarise_dt(avg=mean(Sepal.Length))
ir %>% summarise_dt(mean=mean(Sepal.Length))
ir %>% summarise_when(Petal.Width==.2,avg=mean(Petal.Length))
ir %>% summarise_vars(2:4,sum)
ir %>% summarise_vars(is.numeric,sum)

八、分组计算

分组计算就是根据分组结果来对每一个组进行相同的操作。

在tidyfst包中,很多函数都具有by参数,by用来指定分组的变量。

如果需要对多个变量进行分组,那么by参数的指定方式有以下几种:

●在by参数中放入字符串,变量之间以逗号分隔(如by="vs,am")​;

●在by参数中放入字符向量,字符是分组的列名称(如by=c("vs","am"))​;

●在by参数中放入一个指定分组变量的列表(如by=list(vs,am))​。

ir %>% summarise_dt(avg=mean(Sepal.Length),by=Species)
ir %>% summarise_vars(is.numeric,sum,by=Species)


mt=as_dt(mtcars)
mt
mt %>% summarise_dt(avg=mean(mpg),by="vs,am")
mt %>% summarise_dt(avg=mean(mpg),by=c("vs","am"))
mt %>% summarise_dt(avg=mean(mpg),by=list(vs,am))
mt %>% summarise_dt(avg=mean(mpg),by=.(vs,am))

九、列的重命名

tidyfst包中使用rename_dt函数来对列进行重命名。对多个列进行重命名,只要用逗号隔开即可。

ir %>% rename_dt(sl=Sepal.Length)
ir %>% rename_dt(sl=Sepal.Length,sw=Sepal.Width)
ir %>% rename_with_dt(toupper)
ir %>% setNames(paste0("V",1:5))

十、多表连接

连接是指根据表格所包含的共同信息来对多个表格进行合并的过程。基本的连接可以分为内连接、全连接、左连接和右连接

内连接又称为自然连接,该操作会从结果表中删除与其他被连接表中没有匹配行的所有行,只保留两个表格中都包含的数据条目。

全连接会保留所有表格的所有信息。

左连接则仅会保证左边(即第一个出现的)表格的信息会被完全保留,右边(第二个)表格的信息只有与第一个表格的信息匹配的才能够保留。

右连接是左连接的逆运算,即完全保留第二个表格的信息,而第一个表格中只有与第二个表格的信息匹配的内容才能保留。

还有一种特殊的连接方式叫作过滤型连接,它包括反连接半连接

半连接与左连接相似,但是它只保留了左表格的所有列,而右表格的列则不会放入结果。这相当于只提取了右表格的匹配列,然后与左表格进行连接。

反连接则与半连接相反,它会保留左表和右表对应列相异的部分。

workers=fread("
              name company
              Nick Acme
              John Ajax
              Daniela Ajax
              ")

positions=fread("
                name position
                John designer
                Daniela engineer
                Cathie manager
                ")

workers
positions

workers %>% inner_join_dt(positions)
workers %>% merge(positions)

workers %>% full_join_dt(positions)
workers %>% merge(positions,all = T)

workers %>% left_join_dt(positions)
workers %>% merge(positions,all.x = T)


workers %>% right_join_dt(positions)
workers %>% merge(positions,all.y = T)

workers %>% left_join_dt(positions,by="name")
workers %>% merge(positions,all.x = T,by="name")


positions2=setNames(positions,c("worker","position"))
workers
positions2
workers %>% inner_join_dt(positions2,by=c("name"="worker"))
workers %>% inner_join_dt(positions2,on="name==worker")
workers %>% merge(positions2,by.x="name",by.y = "worker")

workers %>% semi_join_dt(positions)
workers %>% anti_join_dt(positions)

 

十一、长宽转换

tidyfst包中的longer_dt函数实现将“宽数据”转换成“长数据”。

tidyfst包中的wider_dt函数实现“长数据”转成“宽数据”。

stocks=data.frame(
  time=as.Date('2009-01-01')+0:9,
  X=rnorm(10,0,1),
  Y=rnorm(10,0,2),
  Z=rnorm(10,0,4)
)
stocks


# 转成长数据
stocks %>% longer_dt(time) -> long_stocks
long_stocks

stocks %>% longer_dt(time,name="NAME",value="VALUE")

# 转成宽数据
wide_stockes=long_stocks %>% wider_dt(name="name",value="value")
wide_stockes

 

十二、集合运算

tidyfst包函数data.table包函数
交集intersect_dtfintersect
并集union_dtfunion
差集setdiff_dtfsetdiff

注意:tidyfst包会自动地把任意数据框转化为data.table格式。 

十三、缺失值处理

1、删除缺失记录

na.omit函数可以删掉任意包含缺失值的行。

tidyfst包的drop_na_dt函数可以实现删除某一列中存在缺失值的条目。

2、缺失值填充

tidyfst包中的replace_na_dt函数实现填充指定的值。

tidyfst包的fill_na_dt函数实现将上一个观测值作为下面缺失的填充值。

tidyfst包中的impute_dt函数实现使用非缺失数值的均值、中位数或众数来对缺失值进行填充。

十四、列表列的应用

列表列(list column)是R语言中相对较新的一个概念,它能够根据分组把一整块数据集成在一起成为一列,而这个列的数据类型为列表(list)。在tidyfst包中可以使用nest_dt函数进行实现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微服务与分布式实践】探索 Dubbo

核心组件 服务注册与发现原理 服务提供者启动时,会将其服务信息(如服务名、版本、所在节点的网络地址等)注册到注册中心。服务消费者则可以从注册中心发现可用的服务提供者列表,并与之通信。注册中心会存储服务的信息&#xff0c…

SQL Server查询计划操作符(7.3)——查询计划相关操作符(5)

7.3. 查询计划相关操作符 38)Flow Distinct:该操作符扫描其输入并对其去重。该操作符从其输入得到每行数据时即将其返回(除非其为重复数据行,此时,该数据行会被抛弃),而Distinct操作符在产生任何输出前将消费所有输入。该操作符为逻辑操作符。该操作符具体如图7.2-38中…

【AI】【本地部署】OpenWebUI的升级并移植旧有用户信息

【背景】 OpenWebUI的版本升级频率很高,并会修改旧版本的Bug,不过对于已经在使用的系统,升级后现有用户信息都会丢失,于是研究如何在升级后将现有的用户信息移植到升级后版本。 【准备工作】 OpenWebUI的升级步骤在Docker中有现…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.19 排序革命:argsort的十大高阶用法

1.19 排序革命:argsort的十大高阶用法 目录 #mermaid-svg-Qu8PcmLkIc1pOQJ7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Qu8PcmLkIc1pOQJ7 .error-icon{fill:#552222;}#mermaid-svg-Qu8PcmLkIc1pOQJ…

分布式数据库应用实践:架构设计与性能优化

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 在当今数据驱动的世界中,分布式数据库因其高可用性、可扩展性和强大的容错能力,已成为现代企业存储…

实战纪实 | 真实HW漏洞流量告警分析

视频教程在我主页简介和专栏里 目录: 一、web.xml 文件泄露 二、Fastjson 远程代码执行漏洞 三、hydra工具爆破 四、绕过验证,SQL攻击成功 五、Struts2代码执行 今年七月,我去到了北京某大厂参加HW行动,因为是重点领域—-jr&…

一组开源、免费、Metro风格的 WPF UI 控件库

前言 今天大姚给大家分享一个开源、免费、Metro风格的 WPF UI 控件库:MahApps.Metro。 项目介绍 MahApps.Metro 是一个开源、免费、Metro风格的 WPF UI 控件库,提供了现代化、平滑和美观的控件和样式,帮助开发人员轻松创建具有现代感的 Win…

12 款开源OCR发 PDF 识别框架

2024 年 12 款开源文档解析框架的选型对比评测:PDF解析、OCR识别功能解读、应用场景分析及优缺点比较 这是该系列的第二篇文章,聚焦于智能文档处理(特别是 PDF 解析)。无论是在模型预训练的数据收集阶段,还是基于 RAG…

【MySQL】--- 复合查询 内外连接

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: MySQL 🏠 基本查询回顾 假设有以下表结构: 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为…

jemalloc 5.3.0的tsd模块的源码分析

一、背景 在主流的内存库里,jemalloc作为android 5.0-android 10.0的默认分配器肯定占用了非常重要的一席之地。jemalloc的低版本和高版本之间的差异特别大,低版本的诸多网上整理的总结,无论是在概念上和还是在结构体命名上在新版本中很多都…

【Docker】快速部署 Nacos 注册中心

【Docker】快速部署 Nacos 注册中心 引言 Nacos 注册中心是一个用于服务发现和配置管理的开源项目。提供了动态服务发现、服务健康检查、动态配置管理和服务管理等功能,帮助开发者更轻松地构建微服务架构。 步骤 拉取镜像 docker pull nacos/nacos-server启动容器…

DiffuEraser: 一种基于扩散模型的视频修复技术

视频修复算法结合了基于流的像素传播与基于Transformer的生成方法,利用光流信息和相邻帧的信息来恢复纹理和对象,同时通过视觉Transformer完成被遮挡区域的修复。然而,这些方法在处理大范围遮挡时常常会遇到模糊和时序不一致的问题&#xff0…

【JavaEE进阶】图书管理系统 - 壹

目录 🌲序言 🌴前端代码的引入 🎋约定前后端交互接口 🚩接口定义 🍃后端服务器代码实现 🚩登录接口 🚩图书列表接口 🎄前端代码实现 🚩登录页面 🚩…

[权限提升] 操作系统权限介绍

关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 权限提升简称提权,顾名思义就是提升自己在目标系统中的权限。现在的操作系统都是多用户操作系统,用户之间都有权限控制,我们通过 Web 漏洞拿到的 Web 进程的…

【2025美赛D题】为更美好的城市绘制路线图建模|建模过程+完整代码论文全解全析

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析&#xff0c…

linux如何修改密码,要在CentOS 7系统中修改密码

要在CentOS 7系统中修改密码,你可以按照以下步骤操作: 步骤 1: 登录到系统 在登录提示符 localhost login: 后输入你的用户名。输入密码并按回车键。 步骤 2: 修改密码 登录后,使用 passwd 命令来修改密码: passwd 系统会提…

抗体人源化服务如何优化药物的分子结构【卡梅德生物】

抗体药物作为一种重要的生物制药产品,已在癌症、免疫疾病、传染病等领域展现出巨大的治疗潜力。然而,传统的抗体药物常常面临免疫原性高、稳定性差以及治疗靶向性不足等问题,这限制了其在临床应用中的效果和广泛性。为了克服这些问题&#xf…

大模型概述

文章目录 大语言模型的起源大语言模型的训练方式大语言模型的发展大语言模型的应用场景大语言模型的基础知识LangChain与大语言模型 大语言模型的起源 在人类社会中,我们的交流语言并非单纯由文字构成,语言中富含隐喻、讽刺和象征等复杂的含义&#xff0…

关于数字地DGND和模拟地AGND隔离

文章目录 前言一、1、为什么要进行数字地和模拟地隔离二、隔离元件1.①0Ω电阻:2.②磁珠:3.电容:4.④电感: 三、隔离方法①单点接地②数字地与模拟地分开布线,最后再PCB板上一点接到电源。③电源隔离④、其他隔离方法 …

【Redis】常见面试题

什么是Redis? Redis 和 Memcached 有什么区别? 为什么用 Redis 作为 MySQL 的缓存? 主要是因为Redis具备高性能和高并发两种特性。 高性能:MySQL中数据是从磁盘读取的,而Redis是直接操作内存,速度相当快…