当前位置: 首页 > backend >正文

R语言学习--Day03--数据清洗技巧

在一般情况下,我们都是在数据分析的需求前提下去选择使用R语言。而实际上,数据分析里,百分之八十的工作,都是在数据清洗。并不只是我们平时会提到的异常值处理或者是整合格式,更多会涉及到将各种各样的数据整合,按照要求去除掉不合规的数据,再并到一起形成一个纯净的,可利用的数据,甚至有些时候还需要进行脱敏操作,防止对后续模型训练之类的影响,下面我来介绍一下经常会用到的操作。

筛选

按行操作

1、一般来讲,我们用的最多的就是filter(),无他,简单易懂,只需要在括号内加上我们的条件就行了,不过要注意用于筛选的条件一般都是要满足其格式的,建议在写之前先明确好要用到的东西,而不是一股脑地写逻辑。当然了,这里我也踩过一个小坑,就是filter()在运行时是不能识别NA的,在筛选时会自动去掉NA那一行,会因此忽略掉很多信息,所以我们一般先对数据集做NA判断,用is.na(),将NA值返回为1或者0,从而避免过滤了重要的信息。

2、而另一个用的比较多的就是slice()了,一般我们在筛选排名或者时间时用到,比如

lab_base <- lab_base %>%group_by(ID)%>% # 按照ID分组arrange(TIME)%>% # 按照TIME排序 slice(TIME,n=1)%>% # 选取时间最早的数据ungroup()%>%dplyr::select(ID,TIME,VALUE)

代码的意思是在每一组ID的分组内,先按照时间排序,再筛选时间最早的那个数据保留,这种用法相比平时用mid_time,可以节省很多算力空间,尤其是在涉及到数据量很大的rds文件时,大大提高我们的效率。

按列操作

而select()和mutate(),相信如果接触过一点R语言的都知道,我们经常会看到这两个语法,前者是把保存想要的列数据,后者则是对数据进行操作,添加或减少变量,有时也会用来添加中间变量来协助筛选,在结束时再去掉。值得注意的是,有很多包里都有select()的用法,我们一般默认的select()是dplyr里的,如果你不确定是否会调用到其他包的画,像上文用到的dplyr::select会直接调用我们想要的select。

节省算力小技巧

因子化

很多时候,我们存储的数据并不只是值,也有可能是文字,其中,有很多时候属于类别,比如男女,职业等,这个时候其实我们主要的需求是区分,而不是用这个值,自然也希望代码可以像我们一样,用起来简单。这个时候就可以对该列数据因子化,把他转换为分类变量,相当于把中文转换成了数字,这样会更好区分,所用到的内存也会更少。

按类别赋予值

与因子化的核心思想一样,都是通过节省代码判断中文的时间,只不过不同的是,我们可以新建一列,在筛选的同时先赋予一个等同于其类别的数字,方便在后面调用分类的时候用创建的新列,从而节省算力,比如:

lab_base $test_new <- 0
lab_base[grep("医生|科学家|植物学家",lab_base$NEW_JOB),]$test_new <- 1

这样,假如我们要筛选高科技人才时,就可以直接筛选test_new值为1的列。

函数

就像我们在其他语言中学过的类似一样,用function来执行很多需要重复的操作,可以节省算力,并大大提高我们的代码效率以及对代码的理解,但与其他语言不同的是,列表下函数的作用对象是会改变的,也就是说在写逻辑之前,不仅要想逻辑本身是否通顺,更要想清楚操作的对象是否适用于该方法,比如列表下的子列表,很多时候我们会将其转换为dataframe来操作,从而更好地处理数据,但在涉及到用function来操作列表里的内容是,用lapply来操作子列表,也会很方便,也能使其在操作完保持子列表的特性嵌套在列表中。

http://www.xdnf.cn/news/6701.html

相关文章:

  • day32-多线程juc
  • QML元素 - OpacityMask
  • [BJDCTF2020]The mystery of ip
  • Python 在自动驾驶数据标签中的应用:如何让 AI 读懂道路?
  • 2025年山东省省赛数模竞赛C题完整论文+代码分享
  • 【动态导通电阻】GaN HEMT动态导通电阻的精确测量
  • 罗杰斯高频板技术解析:低损耗基材如何定义 5G 通信未来
  • tauri2项目使用tauri-plugin-updater配置更新程序流程
  • 如何阅读、学习 Tcc (Tiny C Compiler) 源代码?如何解析 Tcc 源代码?
  • VsCode和AI的前端使用体验:分别使用了Copilot、通义灵码、iflyCode和Trae
  • iOS音视频解封装分析
  • Spring Batch学习,和Spring Cloud Stream区别
  • MySQL面试知识点详解
  • 计算机图形学基础--Games101笔记(一)数学基础与光栅化
  • 生产级编排AI工作流套件:Flyte全面使用指南 — Core concepts Launch plans
  • 非受控组件在 React 中如何进行状态更新?
  • 好用的拓客APP有哪些?
  • C#学习第23天:面向对象设计模式
  • 基于WISE30sec制作中国1km分辨率土壤属性栅格数据(20种属性/0-200cm深度分层)
  • Flask框架搭建
  • 信号灯和旋钮在接地电阻柜内的作用主要包括以下几个方面
  • 吴恩达 Deep Learning(1-36)ppt逐行理解
  • React中使用openLayer画地图
  • 【大模型面试每日一题】Day 20:大模型出现“幻觉”(Hallucination)的可能原因有哪些?如何从数据或训练层面缓解?
  • 支持蓝牙5.0和2.4G私有协议芯片-PHY6222
  • ISBI 2012 EM 神经元结构分割数据集复现UNet
  • 前端实现流式输出《后端返回Markdown格式文本,前端输出类似于打字的那种》
  • DTC测试点归纳
  • 2025Linux安装配置文档(五)
  • 【Linux】iptables 命令详解