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 companyNick AcmeJohn AjaxDaniela Ajax")positions=fread("name positionJohn designerDaniela engineerCathie manager")workers
positionsworkers %>% 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_stocksstocks %>% 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函数进行实现。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Qt5.15.2编写Android程序时遇到的问题及解决方法

文章目录 背景1.文件读写 背景 目前我用的是Qt5.15.2来编写Qt程序,环境的配置看我这篇文章【Qt5.15.2配置Android开发环境】 项目中的一些配置的截图: 1.文件读写 假如直接用 QFileDialog::getExistingDirectory来获取路径的话,会得到类…

【学术会议-第五届机械设计与仿真国际学术会议(MDS 2025) 】前端开发:技术与艺术的完美融合

重要信息 大会官网:www.icmds.net 大会时间:2025年02月28日-03月02日 大会地点:中国-大连 会议简介 2025年第五届机械设计与仿真国际学术会议(MDS 2025) 将于2025年02月28-3月02日在中国大连召开。MDS 2025将围绕“机械设计”…

leetcode刷题记录(一百)——121. 买卖股票的最佳时机

(一)问题描述 121. 买卖股票的最佳时机 - 力扣(LeetCode)121. 买卖股票的最佳时机 - 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并…

亲测有效!解决PyCharm下PyEMD安装报错 ModuleNotFoundError: No module named ‘PyEMD‘

解决PyCharm下PyEMD安装报错 PyEMD安装报错解决方案 PyEMD安装报错 PyCharm下通过右键自动安装PyEMD后运行报错ModuleNotFoundError: No module named ‘PyEMD’ 解决方案 通过PyCharm IDE python package搜索EMD-signal,选择版本后点击“install”执行安装

上海亚商投顾:沪指冲高回落 大金融板块全天强势 上海亚商投

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天冲高回落,深成指、创业板指午后翻绿。大金融板块全天强势,天茂集团…

【unity游戏开发之InputSystem——02】InputAction的使用介绍(基于unity6开发介绍)

文章目录 前言一、InputAction简介1、InputAction是什么?2、示例 二、监听事件started 、performed 、canceled1、启用输入检测2、操作监听相关3、关键参数 CallbackContext4、结果 三、InputAction参数相关1、点击齿轮1.1 Actions 动作(1)动…

ubuntu22安装issac gym记录

整体参考:https://blog.csdn.net/Yakusha/article/details/144306858 安装完成后的整体版本信息 ubuntu:22.04内核:6.8.0-51-generic显卡:NVIDIA GeForce RTX 3050 OEM显卡驱动:535.216.03cuda:12.2cudnn&…

Linux下Ubuntun系统报错find_package(BLAS REQUIRED)找不到

Linux下Ubuntun系统报错find_package(BLAS REQUIRED)找不到 这次在windows的WSL2中遇到了一个非常奇怪的错误,就是 CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):Could NOT find BLAS (missing: BLAS_LIBRAR…

15天基础内容-5

day13 【String类、StringBuilder类】 主要内容 String类常用方法【重点】 String类案例【重点】 StringBuilder类【重点】 StringBuilder类常用方法【重点: append】 StringBuilder类案例【理解】 第一章String类 1.1 String类的判断方法 String类实现判断功能…

CommonAPI学习笔记-1

CommonAPI学习笔记-1 一. 整体结构 CommonAPI分为两层:核心层和绑定层,使用了Franca来描述服务接口的定义和部署,而Franca是一个用于定义和转换接口的框架(https://franca.github.io/franca/)。 ​ 核心层和通信中间…

单片机基础模块学习——DS18B20温度传感器芯片

不知道该往哪走的时候,就往前走。 一、DS18B20芯片原理图 该芯片共有三个引脚,分别为 GND——接地引脚DQ——数据通信引脚VDD——正电源 数据通信用到的是1-Wier协议 优点:占用端口少,电路设计方便 同时该协议要求通过上拉电阻…

Golang Gin系列-9:Gin 集成Swagger生成文档

文档一直是一项乏味的工作(以我个人的拙见),但也是编码过程中最重要的任务之一。在本文中,我们将学习如何将Swagger规范与Gin框架集成。我们将实现JWT认证,请求体作为表单数据和JSON。这里唯一的先决条件是Gin服务器。…

< OS 有关 > 阿里云:轻量应用服务器 的使用 :轻量化 阿里云 vpm 主机

原因: < OS 有关 > 阿里云:轻量应用服务器 的使用 :从新开始 配置 SSH 主机名 DNS Tailscale 更新OS安装包 最主要是 清除阿里云客户端这个性能杀手-CSDN博客 防止 I/O 祸害系统 操作: 查看进程&#x…

设计模式的艺术-代理模式

结构性模式的名称、定义、学习难度和使用频率如下表所示: 1.如何理解代理模式 代理模式(Proxy Pattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式是一种对象结构型模式。 代理模式类型较多…

K8S极简教程(4小时快速学会)

1. K8S 概览 1.1 K8S 是什么 K8S官网文档:https://kubernetes.io/zh/docs/home/ 1.2 K8S核心特性 服务发现与负载均衡:无需修改你的应用程序即可使用陌生的服务发现机制。存储编排:自动挂载所选存储系统,包括本地存储。Secret和…

python3+TensorFlow 2.x(五)CNN

目录 CNN理解 code实现人脸识别 数据集准备: code实现 模型解析 结果展示 结果探讨 基于vgg16的以图搜图 数据准备 图库database 检索测试集datatest code实现 code解析 结果展示 CNN理解 卷积神经网络(CNN)是深度学习中最强大…

(一)HTTP协议 :请求与响应

前言 爬虫需要基础知识,HTTP协议只是个开始,除此之外还有很多,我们慢慢来记录。 今天的HTTP协议,会有助于我们更好的了解网络。 一、什么是HTTP协议 (1)定义 HTTP(超文本传输协议&#xff…

FPGA实现任意角度视频旋转(完结)视频任意角度旋转实现

本文主要介绍如何基于FPGA实现视频的任意角度旋转,关于视频180度实时旋转、90/270度视频无裁剪旋转,请见本专栏前面的文章,旋转效果示意图如下: 为了实时对比旋转效果,采用分屏显示进行处理,左边代表旋转…

如何移植ftp服务器到arm板子?

很多厂家提供的sdk,一般都不自带ftp服务器功能, 需要要发人员自己移植ftp服务器程序。 本文手把手教大家如何移植ftp server到arm板子。 环境 sdk:复旦微 Buildroot 2018.02.31. 解压 $ mkdir ~/vsftpd $ cp vsftpd-3.0.2.tar.gz ~/vs…

【阅读笔记】基于整数+分数微分的清晰度评价算子

本文介绍的是一种新的清晰度评价算子,整数微分算子分数微分算子 一、概述 目前在数字图像清晰度评价函数中常用的评价函数包括三类:灰度梯度评价函数、频域函数和统计学函数,其中灰度梯度评价函数具有计算简单,评价效果好等优点…