在《生信小白自学攻略》系列的前几篇文章中,我们已经了解了 R 和 RStudio 的安装、RStudio 的深度探索,以及 R 语言的基本数据类型和数据结构。现在,是时候深入探讨如何运用 R 语言对数据进行精细化处理了。本篇推文将详细介绍如何在 R 中对数据进行排序、筛选、替换以及调用特定行和列等核心操作。

准备工作:导入你的数据

在进行任何数据处理之前,我们首先需要将文件中的数据导入到 R 中。常用的数据格式包括 .csv(逗号分隔值)、 .txt(制表符分隔值)、.xls 和 .xlsx 等格式。R语言有内置函数读取文件,也有扩展包函数读取相应文件。在这里,我只介绍常用的,掌握这些函数就可以熟练读取不同文件了。

read.table(): 这是一个通用的文本文件读取函数,你可以通过 sep 参数指定分隔符(如空格、制表符或逗号)。默认情况下,它能识别空格或制表符作为分隔符。

read_excel(): 读取 Excel 文件,可以指定工作表 (sheet)。

假设你有一个名为 data.txt 的基因表达数据文件,它包含了基因ID、样本信息和表达量等,我们可以这样导入:

# 制表符分隔的TXT文件
data <- read.table("data.txt", header = TRUE, row.names = 1, sep = "\t")# 如果是逗号分隔的csv文件
# data <- read.table("data.csv", header = TRUE, row.names = 1, sep = ",")# 查看数据的前几行,确保导入正确
head(data)

导入数据后,你可以使用 dim() 查看数据的维度(行数和列数),str() 查看数据结构,以及 summary() 获取数据的统计摘要。

R 语言数据处理的核心利器:dplyr 包

在 R 语言中进行数据处理,dplyr 包是不可或缺的工具。它是 tidyverse 系列包中的一员,提供了一套简洁、一致的函数,让数据操作变得直观高效。dplyr 的核心理念是使用一系列“动词”来描述数据操作,如 filter()(筛选)、select()(选择)、arrange()(排序)、mutate()(新增/修改列)和 summarise()(汇总)。

如果尚未安装 dplyr 包,请先安装 tidyversedplyr 是其一部分):

install.packages("tidyverse")
library(dplyr)

数据筛选 (filter())

数据筛选是根据特定条件选择数据子集的操作。dplyr 中的 filter() 函数可以帮助我们轻松实现这一点。

单条件筛选

选择所有性别为“Female”的患者:

female_patients <- filter(patient_data, Gender == "Female")
print(female_patients)

多条件筛选

选择所有年龄大于 50 岁且患有癌症的患者:

old_cancer_patients <- filter(patient_data, Age > 50 & DiseaseStatus == "Cancer")
print(old_cancer_patients)

注意:

  • == 表示“等于”

  • != 表示“不等于”

  • > 或 >= 表示“大于”或“大于等于”

  • 或 <= 表示“小于”或“小于等于”

  • & 表示“和”(所有条件都满足)

  • | 表示“或”(满足任一条件)

  • %in% 表示“包含于”(例如:DiseaseStatus %in%c("Cancer", "Healthy")

  • is.na() 用于筛选缺失值

  • !is.na() 用于筛选非缺失值

筛选缺失值

筛选 TumorSize 列中存在缺失值的行:

patients_with_missing_tumor_size <- filter(patient_data, is.na(TumorSize))
print(patients_with_missing_tumor_size)

数据排序 (arrange())

数据排序是根据一个或多个列的值,对数据框中的行进行升序或降序排列。dplyr 中的 arrange() 函数可以完成这项任务。

单列升序排序

根据患者年龄 Age 进行升序排列:

patients_sorted_by_age_asc <- arrange(patient_data, Age)
print(patients_sorted_by_age_asc)

单列降序排序

根据患者年龄 Age 进行降序排列,需要使用 desc() 函数:

patients_sorted_by_age_desc <- arrange(patient_data, desc(Age))
print(patients_sorted_by_age_desc)

多列排序

首先按疾病状态 DiseaseStatus 升序,然后按年龄 Age 降序排列:

patients_sorted_multi <- arrange(patient_data, DiseaseStatus, desc(Age))
print(patients_sorted_multi)

列的选取和操作 (select(), mutate(), rename())

对数据框的列进行操作是数据处理的另一个重要方面,包括选取、新增、修改和重命名列。

选取特定列 (select())

只保留 PatientIDAge 和 DiseaseStatus 三列:

selected_columns <- select(patient_data, PatientID, Age, DiseaseStatus)
print(selected_columns)

除了直接指定列名,你也可以使用一些辅助函数:

  • startswith("prefix"):选择以特定前缀开头的列

  • ends_with("suffix"):选择以特定后缀结尾的列

  • contains("string"):选择包含特定字符串的列

  • matches("regex"):选择匹配正则表达式的列

  • everything():选择所有列

  • c() 或 ::选取连续的列

例如,选择除了 TumorSize 之外的所有列:

all_except_tumor_size <- select(patient_data, -TumorSize)
print(all_except_tumor_size)

新增或修改列 (mutate())

mutate() 函数用于创建新列,或修改现有列。

1、新增列:计算年龄组

根据年龄创建一个新的 AgeGroup 列:

patient_data_with_age_group <- mutate(patient_data,AgeGroup = case_when(Age < 40 ~ "Young",Age >= 40 & Age < 60 ~ "Middle-aged",TRUE ~ "Elderly" # 否则)
)
print(patient_data_with_age_group)

case_when() 是一个非常有用的函数,用于实现多条件判断赋值。

2、修改现有列:肿瘤大小单位转换

假设 TumorSize 是厘米,我们想将其转换为毫米并覆盖原列:

patient_data_tumor_mm <- mutate(patient_data, TumorSize = TumorSize * 10)
print(patient_data_tumor_mm)

3、重命名列 (rename())

将 DiseaseStatus 列重命名为 Diagnosis

patient_data_renamed <- rename(patient_data, Diagnosis = DiseaseStatus)
print(patient_data_renamed)

语法是 新列名 =旧列名

数据的替换和清理 (replace_na(), 基础R替换)

在真实数据中,缺失值(NA)非常常见,对其进行合理处理至关重要。此外,有时我们也需要替换特定值。

缺失值替换 (replace_na())

tidyr 包(也是 tidyverse 的一部分)中的 replace_na() 函数可以方便地替换缺失值。

将 TumorSize 列中的缺失值(NA)替换为 0:

library(tidyr) # 需要加载 tidyr 包patient_data_na_replaced <- patient_data %>%replace_na(list(TumorSize = 0)) # 注意这里要用 list()
print(patient_data_na_replaced)

在这里,我们引入了 %>% 管道符,它来自 magrittr 包(tidyverse 自动加载)。管道符可以将前一个函数的输出作为后一个函数的第一个参数,大大提高了代码的可读性,让数据处理流程更加流畅。上面的代码可以理解为“将 patient_data 传递给 replace_na() 函数”。

替换特定值

有时我们需要根据条件替换某个列中的值。例如,将 DiseaseStatus 列中的“Healthy”替换为“Control”。

# 使用 ifelse() 函数
patient_data_status_replaced <- patient_data
patient_data_status_replaced$DiseaseStatus <- ifelse(patient_data_status_replaced$DiseaseStatus == "Healthy","Control",patient_data_status_replaced$DiseaseStatus
)
print(patient_data_status_replaced)

或者使用 dplyr 的 mutate() 和 case_when() 组合,它通常更灵活:

patient_data_status_replaced_dplyr <- patient_data %>%mutate(DiseaseStatus = case_when(DiseaseStatus == "Healthy" ~ "Control",TRUE ~ DiseaseStatus # 否则保持原样))
print(patient_data_status_replaced_dplyr)

小结

本篇教程详细介绍了 R 语言中数据导入以及对数据进行筛选、替换和调用特定行和列等核心操作。我们重点讲解了 dplyr 包的强大功能,并通过实际示例演示了 filter()arrange()select()mutate() 和 rename() 等函数的用法。

本系列有关R和Rstudio的文章已经更新了四篇,大家可以尝试处理一下手头的数据,R语言的快速掌握离不开动手实践!下一篇我们将学习R语言函数与参数的介绍。

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

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

相关文章

从零开始学习概念物理(第13版)(1)

前言&#xff1a;对我来说&#xff0c;最有用的就是物理了&#xff0c;尤其是电磁学。但是要学好它&#xff0c;我得夯实我的基础&#xff0c;前面更加基础的数学和物理都不能拉下。现在我问了Deepseek推荐的国外物理书&#xff0c;这本《概念物理》是最适合我&#xff0c;等入…

CSS变量

元素背景需要统一&#xff0c;一个个设置修改起来很麻烦&#xff0c;也没有全局变量&#xff1f; CSS中的变量_css变量-CSDN博客 -- 前缀定义变量&#xff0c;var(--) 使用变量&#xff0c;:root 表示根元素。 :root { --bg:#222; --fg:#bbb; } body { background:var(--bg)…

C++(Qt)软件调试---vscode配置clang-tidy静态分析(30)

C(Qt)软件调试—vscode配置clang-tidy静态分析&#xff08;30&#xff09; 文章目录C(Qt)软件调试---vscode配置clang-tidy静态分析&#xff08;30&#xff09;[toc]1 概述2 clang-tidy基本用法3 目前已有检查项4 vscode配置clang-tidy5 .clang-tidy配置文件6 参考地址更多精彩…

每天自动备份oracle

oracle数据库比其他数据库都贵&#xff0c;但是自带的管理工具却很差&#xff0c;真不知道咋想的。想完成每天自动备份&#xff0c;只能自己动手(window环境)&#xff1a;1、创建个备份目录&#xff0c;如D:\databack2、创建个脚本&#xff1a;backup.bat核心内容如下&#xff…

HBase Coprocessor:扩展HBase功能的利器

HBase Coprocessor&#xff1a;扩展HBase功能的利器 关键词&#xff1a;HBase, Coprocessor, 协处理器, RegionServer, 分布式计算, 扩展功能, 二级索引 摘要&#xff1a;HBase作为Hadoop生态中的分布式列存储数据库&#xff0c;以高可靠性、高吞吐量和强一致性著称&#xff0c…

【Java后端】Spring Boot 实现请求设备来源统计与UA解析全攻略

Spring Boot 实现请求设备来源统计与UA解析全攻略 在 Web 应用的实际场景中&#xff0c;我们经常需要知道 请求来自哪里 —— 是 Android 手机&#xff1f;还是 iOS&#xff1f;或者是 PC 浏览器&#xff1f; 这类信息往往可以通过 User-Agent (UA) 来统计&#xff0c;进而帮助…

技术框架搭建:支撑竞拍全流程

纯竞拍的技术框架是一个多层协同的系统&#xff0c;从用户交互到数据处理&#xff0c;每个环节都有专门的技术组件提供支持。​前端层是用户与竞拍系统交互的窗口&#xff0c;核心目标是提供流畅、实时、直观的操作体验。采用 React、Vue 等主流前端框架构建单页应用&#xff0…

2025.8.18-2025.8.24第34周:有内耗有挣扎

&#x1f31f; 本周完成的3件亮点事情&#xff08;可具体写过程&#xff09;&#xff1a; openvla debug起来了把上周的演讲视频发给了导师&#xff0c;人家帮我提了很多建议。罗永浩&#xff0c;李想4小时访谈看完了即兴演讲开始不内耗&#xff0c;直接讲&#xff0c;这样才能…

点播视频预览是怎么做到的?

看进度条上的小窗口&#xff0c;你有没有想过&#xff0c;哔哩哔哩是如何在进度条上显示视频预览的? 这个功能非常有用&#xff0c;尤其是在播放长视频时。 如何才能实现? 实现这一点有三种方法。 预先为视频生成 CSS sprites&#xff0c;并通过 API 获取预先为视频生成 W…

prometheus监控kubernetes集群并使用 grafana展示数据

目录 Prometheus组成及架构 prometheus核心组件 1.Prometheus Server 2.Exporters 3.Alertmanager 4.Pushgateway 数据流程 在k8s中部署PrometheusGrafana钉钉告警邮件告警 将kube-Prometheus包下载后传入虚拟机 tar -xzv kube-promethus.zip cd 进入 ll 显示目录 …

K8s 实战:Pod 版本更新回滚 + 生命周期管控

一、版本更新与回滚实验背景本实验通过 Kubernetes 的 Deployment 资源演示应用的版本更新与回滚流程。Deployment 是 Kubernetes 中用于管理 Pod 和 ReplicaSet 的核心资源&#xff0c;支持滚动更新&#xff08;避免服务中断&#xff09;和版本回滚&#xff08;应对更新故障&a…

静电服漏检率↓79%!陌讯多模态识别算法在智慧安检的实战解析

​原创声明​​&#xff1a;本文技术方案引自《陌讯视觉算法技术白皮书V3.1》&#xff0c;实测数据来自工业场景部署验证 一、行业痛点&#xff1a;静电防护失效的隐形风险 据《电子制造业安防报告2025》统计&#xff0c;精密电子车间因静电服穿戴不规范导致的次品率高达23%&a…

StarRocks不能启动 ,StarRocksFe节点不能启动问题 处理

StarRocks不能启动 &#xff0c;StarRocksFe节点不能启动问题 处理 问题描述 mysql:[Warning] Using a passwordon the command line interface can be insecureERROR 2003 (HYa00): Can’t connect to MysoL server on ‘192.168.5.128:9030’(111)Error: failed to query fE…

麒麟系统播放图片 速度比较

pygame效果比opencv好&#xff0c;opencv有锯齿&#xff1a;import pygame import os import timedef show_image_sdl(image_path):"""使用SDL2快速显示图片"""# 初始化pygamepygame.init()# 获取屏幕信息info pygame.display.Info()screen_wid…

复杂场景横幅识别准确率↑91%!陌讯多模态融合算法在智慧园区的实战解析

一、行业痛点&#xff1a;园区违规横幅识别的三重挑战 据《2024智慧园区安防报告》&#xff08;来源&#xff1a;CCSA TC10&#xff09;统计&#xff1a; ​​强光干扰​​&#xff1a;玻璃幕墙反光导致文字识别错误率超50% ​​形变干扰​​&#xff1a;横幅褶皱、飘动造成关…

Mybatis Plus - 代码生成器简单使用

1.引入依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.12</version></dependency><dependency><groupId>com.baomidou</groupId><ar…

vue2腾讯地图点击地图获取地址经纬度web

注意&#xff1a;&#xff01;&#xff01;&#xff01;在做uniapp小程序导航功能时&#xff0c;拿到我们在后台管理设置的经纬度&#xff0c;根据经纬度去导航到店的时候&#xff0c;最好用腾讯地图来获取经纬度&#xff0c;uniapp小程序那边默认导航经纬度是腾讯系的&#xf…

7.6 残差网络

随着我们设计越来越深的网络&#xff0c;深刻理解 新添加的层如何提升神经网络的性能&#xff0c;变得至关重要。更重要的是设计网络的能力&#xff0c;在这种网络中&#xff0c;添加层会使网络更具有表达力&#xff0c;为了取得质的突破&#xff0c;需要一些数学基础。7.6.1 函…

建模工具Sparx EA的多视图协作教程

在传统建模工具中&#xff0c;功能繁杂、界面混乱、窗口频繁切换等问题长期困扰着架构师与开发人员&#xff0c;不仅拖慢设计节奏&#xff0c;更导致模型与文档严重脱节。企业架构与建模平台Sparx EA直面这些挑战&#xff0c;通过现代化的Ribbon界面与多视图协作机制&#xff0…

从聚类到集成,两种实用算法框架分享

一、K-means&#xff1a;让数据自己 “找组织”什么是聚类&#xff1f;聚类属于无监督学习的范畴 —— 简单说就是手里没有标签时&#xff0c;我们要把长得像的样本分到一组。比如给一堆用户数据&#xff0c;不需要提前知道 “高价值用户”“潜在用户” 这些标签&#xff0c;聚…