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

入门必学 | R语言for循环的常规应用

文章目录

  • 何为判断语句
  • 在for循环中添加判断语句
  • 嵌套循环

   在上一节中,我们介绍了迭代与for循环,并对for循环的结构与原理进行了深入的介绍。在这一节中,我们将分享for循环的常规应用,包括在其中加入判断语句与嵌套循环。

何为判断语句

判断语句可以指定一个或多个要测试的条件,基于条件为真和条件为假的情况执行不同的运算处理。在R语言中,你可以使用if, else if和else来定义判断结构。以下是如何定义这些结构的详细说明:

  • 「if结构」:用于测试一个条件。如果该条件为真(TRUE),则执行相关的代码块。
if(条件){# 如果条件为真,则执行此代码,若不满足,则不执行
}
  • 「if-else结构」:在if的基础上添加了一个else部分。如果if中的条件为假(FALSE),则执行else中的代码。
if(条件){# 如果条件为真,则执行此代码
} else {# 如果条件为假,则执行此代码
}
  • 「if-else if-else结构」:可以用来测试多个条件。它会按顺序检查每一个else if,直到找到一个为真的条件或者所有条件都被检查过。因此,你可根据需要串联任意数量的else if语句。
if(条件1){# 条件1为真时执行的代码
} else if (条件2) {# 条件1为假但条件2为真时执行的代码
} else {# 条件1和条件2都为假时执行的代码
}

根据数据分析的需求,你可以只使用if,或者与else、else if组合使用。例如:

x<- 10
if(x > 10){print("x大于10")
} else if(x == 10){print("x等于10")
} else{print("x小于10")
}

这段代码会输出“x等于10”。

在for循环中添加判断语句

在上一节中,我们介绍了for循环中的循环体,它是对数据执行具体操作的代码,基于不同的i值会重复运行。但我们并不总是可以在循环中进行相同的运算,有时候需要通过判断语句对数据加以判断,执行对应的更加合适的运算。

假设如下场景:我对三种不同的生物Sample1、Sample2、Sample3进行了处理实验,并分别收集了对照组CK与处理组Treatment的数据,随后在不同的物种中对处理组与对照组进行差异分析。

在分析前,我们需要判断数据是否符合正态分布,如果符合,那我们使用T-test,反之则使用Wilcox-test。

「模拟数据」

set.seed(123)
CK <- data.frame(Sample1 = rnorm(30, mean = 50, sd = 10),Sample2 = rnorm(30, mean = 50, sd = 10),Sample3 = runif(30, min = 40, max = 60))
Treatment <- data.frame(Sample1 = rnorm(30, mean = 55, sd = 10),Sample2 = rnorm(30, mean = 50, sd = 10),Sample3 = runif(30, min = 45, max = 55))>head(CK)Sample1  Sample2  Sample3
1 44.39524 54.26464 52.95787
2 47.69823 47.04929 46.39641
3 65.58708 58.95126 46.15440
4 50.70508 58.78133 44.39535
5 51.29288 58.21581 47.38978
6 67.15065 56.88640 59.68438>head(Treatment)Sample1  Sample2  Sample3
1 65.25571 49.54972 53.71043
2 52.15227 42.15096 45.06301
3 42.79282 33.32058 45.72057
4 56.81303 46.19773 46.64211
5 53.61109 59.18997 52.70334
6 55.05764 44.24653 52.35184
  • 「输出output」:我们想要收集每次差异分析的结果,包括进行分析的物种、使用的方法、统计量与P值。
results<- setNames(data.frame(matrix(ncol = 4, nrow = 0)),#生成一个0行*4列的空数据框c("Sample", "Method", "Statistics", "P-value"))#对数据框的列进行命名> results
[1] Sample     Method     Statistics P-value   
<0> (0-长度的row.names)
  • 「for循环」:在循环中加入判断语句,按数据是否符合正态分布执行不同的分析。具体循环如下:
for (i in 1:3) {#序列,有3种生物# Shapiro-Wilk正态性检验shapiro1 <- shapiro.test(CK[[i]])shapiro2 <- shapiro.test(Treatment[[i]])# 如果两组数据都符合正态分布,使用t检验if (shapiro1$p.value > 0.05 & shapiro2$p.value > 0.05) {test_result<- t.test(CK[,i], Treatment[,i])result<- data.frame(Sample = colnames(CK)[i],#此次分析的物种名Method = "T-test",#分析方法Statistics = test_result$statistic,#统计量`P-value` = test_result$p.value)#P值} # 否则,使用Wilcoxon秩和检验else {test_result <- wilcox.test(CK[,i], Treatment[,i])result<- data.frame(Sample = colnames(CK)[i],Method = "Wilcox-test",Statistics = test_result$statistic,`P-value` = test_result$p.value)}results<- rbind(results, result)#使用rbind函数对每次重复的结果进行打包
}> print(results)Sample      Method Statistics     P.value
t  Sample1      T-test  -3.071780 0.003278294
t1 Sample2      T-test   1.855653 0.068590660
W  Sample3 Wilcox-test 454.000000 0.959042956

嵌套循环

在R语言中,嵌套循环就是在一个循环内部放置另一个循环。这通常用于遍历矩阵、列表或其他复合数据结构的多个维度。

以下是嵌套for循环的基本结构:

for(i in seq1){for(j in seq2){# 执行操作}
}

其中,seq1和seq2是你希望循环遍历的序列,他是分层进行重复的。具体而言,就是先对seq1[1]中的所有seq2进行遍历,然后再跳转到seq1[2]对seq2进行遍历,直到将全部的seq1遍历完成。实际上可以按数据维度数量构建多层嵌套,但嵌套for循环运算效率很低,这个我们以后再谈。

还是上面的例子,这次我们对数据多加一个维度,即对物种按性别进行分类。对相同物种、性别中的处理组与对照组进行差异分析。因此,在分析时,我们需要对数据按物种与性别划分成不同的子集,随后使用嵌套结构的for循环对每个子集进行分析。

「模拟数据并构建输出」

CK <- data.frame(Sample1 = rnorm(30, mean = 50, sd = 10),Sample2 = rnorm(30, mean = 50, sd = 10),Sample3 = runif(30, min = 40, max = 60),Sex = rep(c("Male", "Female"), 15))
Treatment <- data.frame(Sample1 = rnorm(30, mean = 55, sd = 10),Sample2 = rnorm(30, mean = 50, sd = 10),Sample3 = runif(30, min = 45, max = 55),Sex = rep(c("Male", "Female"), 15))>head(CK)Sample1  Sample2  Sample3    Sex
1 57.87739 39.36674 50.94919   Male
2 57.69042 62.63185 52.88480 Female
3 53.32203 46.50350 51.92527   Male
4 39.91623 41.34487 46.43875 Female
5 48.80547 47.63720 57.82229   Male
6 47.19605 48.02824 52.52514 Female>head(Treatment)Sample1  Sample2  Sample3    Sex
1 55.59750 49.11435 50.53314   Male
2 47.95404 60.80799 54.06048 Female
3 47.82782 56.30754 50.87461   Male
4 63.84650 48.86360 49.23464 Female
5 44.84407 34.67098 54.49585   Male
6 74.55294 44.78883 52.09038 Femaleresults<- setNames(data.frame(matrix(ncol = 4, nrow = 0)),c("Sample", "Sex", "Method", "Statistics", "P-value"))> results
[1] Sample     Sex        Method     Statistics P-value   
<0> (0-长度的row.names)
  • 「for循环」:按物种与性别类型分别构建两个序列,然后。具体循环如下:
for(j in 1:2){#性别序列ck<- CK[CK$Sex == unique(CK$Sex)[j],]#按j所在的性别,构建只有这个性别的数据子集treatment<- Treatment[Treatment$Sex == unique(Treatment$Sex)[j],]for(i in 1:3){#物种序列# Shapiro-Wilk正态性检验shapiro1 <- shapiro.test(ck[,i])shapiro2 <- shapiro.test(treatment[,i])# 如果两组数据都符合正态分布,使用t检验if (shapiro1$p.value > 0.05 & shapiro2$p.value > 0.05){test_result<- t.test(ck[,i], treatment[,i])result<- data.frame(Sample = colnames(ck)[i],Sex = unique(ck$Sex),Method = "T-test",Statistics = test_result$statistic,`P-value` = test_result$p.value)} # 否则,使用Wilcoxon秩和检验else {test_result <- wilcox.test(ck[[i]], treatment[[i]])result<- data.frame(Sample = colnames(ck)[i],Sex = unique(ck$Sex),Method = "Wilcox-test",Statistics = test_result$statistic,`P-value` = test_result$p.value)}results<- rbind(results, result)}
}>print(results)Sample    Sex      Method  Statistics    P.value
t  Sample1   Male      T-test  -2.1077511 0.04420295
t1 Sample2   Male      T-test   0.9839381 0.33376260
W  Sample3   Male Wilcox-test 108.0000000 0.87019446
t2 Sample1 Female      T-test  -2.1742758 0.03883036
t3 Sample2 Female      T-test   1.5608796 0.13007330
t4 Sample3 Female      T-test   0.3913041 0.69955720

这样就自动得到了我们想要的结果。细节可以参考文中代码,有疑惑可以留言讨论~

相关文章:

入门必学 | R语言for循环的常规应用

文章目录 何为判断语句在for循环中添加判断语句嵌套循环 在上一节中&#xff0c;我们介绍了迭代与for循环&#xff0c;并对for循环的结构与原理进行了深入的介绍。在这一节中&#xff0c;我们将分享for循环的常规应用&#xff0c;包括在其中加入判断语句与嵌套循环。 何为判断语…...

metaRTC集成flutter ui demo编译指南

概要 Flutter是由Google开发的开源UI工具包&#xff0c;用于构建跨平台应用程序&#xff0c;支持linux/windows/mac/android/ios等操作系统。 metaRTC新增flutter demo&#xff0c;支持linux/windows/mac/android/ios操作系统&#xff0c;此demo在ubuntu桌面环境下测试成功。…...

int怎么转成QString?

2023年10月31日&#xff0c;周二晚上 要将 int 类型转换为 QString&#xff0c;可以使用 QString::number() 方法。 下面是一个示例代码&#xff1a; int number 123; QString str QString::number(number);还可以在转换时指定进制&#xff0c;比如将整数转换为十六进制的字…...

JavaScript进阶(二十九): 走近 es6 之 new.target

文章目录 一、前言二、new.target 重写三、拓展阅读 一、前言 源码阅读过程中&#xff0c;发现以下语句 new.target.prototype鉴于该语法为es6所有&#xff0c;项目在编译过程中&#xff0c;控制台报Unexpected token: punc(.)错误。按照常规处理&#xff0c;应用babel-loade…...

JVM虚拟机:堆结构的逻辑分区

堆内存的逻辑分区 堆内存的逻辑分区如下所示: 堆内存中分为新生代和老年代,二者空间大小1:3。在新生代里面分为两类区域(eden、survivor),三个区域(eden、survivor、survivor),三个区大小比例为8:1:1。 对象存放的位置 栈 当我们new一个对象的时候,首先会将对象…...

RabbitMQ学习02

Hello World&#xff08;Java&#xff09; 1.导入依赖 <!--指定 jdk 编译版本--><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration&g…...

android中的Package安装、卸载、更新替换流程

android系统在安装&#xff0c;删除&#xff0c;替换&#xff0c;清除数据等与应用相关的动作时&#xff0c;会发出对应的Broadcast&#xff0c;上层的应用通过注册相应的广播事件来做相应的处理。 官方文档中给出了详尽的罗列&#xff1a; ACTION_PACKAGE_ADDED 一个新应用包已…...

思维训练第三课 反意疑问句

系列文章目录 文章目录 系列文章目录前言一、什么是反意疑问句二、反意疑问句的回答&#x1f49a;主系表/主谓宾&#xff08;肯定&#xff09;&#xff0c;否定提问1、一般现在时2、一般过去时3、一般将来时4、现在完成时 &#x1f49b; 主谓宾1、一般现在2、一般过去3、一般将…...

nvm安装步骤

注意事项 不要安装任何版本的node.js&#xff0c;有的话卸载干净&#xff01;注意&#xff1a;要卸载干净了&#xff01; 安装步骤&#xff1a; nvm下载 点击exe文件安装 安装目录选择&#xff1a;D:\NVM 下一步创建nodejs文件放在D:\NVM 下&#xff0c;然后一直next到最后 …...

关于比较级(内含名词比较级)

在比较级中&#xff0c;修饰形容词一般使用more 或者-er的变体&#xff0c;但是怎么修饰名词呢&#xff1f; 即&#xff0c;如果我们想表达&#xff1a;你能不能表现得更马屁精一点&#xff1f;这种针对一个具体名词的程度升级怎么表达呢&#xff1f; 使用be more of 名词的…...

【算法|动态规划 | 线性dp | 最长上升子序列模型No.1】AcWing1017.怪盗基德的滑翔翼 AcWing1014.登山

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【AcWing算法提高学习专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望对大家…...

2023年道路运输企业主要负责人证模拟考试题库及道路运输企业主要负责人理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年道路运输企业主要负责人证模拟考试题库及道路运输企业主要负责人理论考试试题是由安全生产模拟考试一点通提供&#xff0c;道路运输企业主要负责人证模拟考试题库是根据道路运输企业主要负责人最新版教材&#…...

Linux学习第26天:异步通知驱动开发: 主动

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 在正式开启今天的学习前&#xff0c;讲一讲为什么标题中加入了【主动】俩字。之前学习的阻塞和非阻塞IO&#xff0c;都是在被动的接受应用程序的操作。而今天的学…...

SpringBoot的核心配置:YAML概述、基础语法;JSR303数据校验;多环境切换

SpringBoot核心配置 SpringBoot配置文件分类 SpringBoot是基于约定的&#xff0c;所以很多配置都有默认值&#xff0c;但如果想使用自己的配置替换默认配置的话&#xff0c;就可以使用 application.properties或者application.yml&#xff08;application.yaml&#xff09;进…...

把Qt6.2.4内置的标签打印了一遍

2023年10月31日&#xff0c;周二晚上 #include <QGridLayout> #include <QPushButton> #include <QLabel> #include <QApplication> #include <QStyle>int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget widget;widget.set…...

element-ui 表单校验・大全

目录 1、对全部表单项的校验2、校验指定字段3、自定义函数校验表单4、一行内多个输入框的校验 element-ui 官网 element-ui 表单校验的规则如下&#xff1a; <属性名>: [{ required: true,// 是否必填&#xff08;若有label则在其左上角显示红点&#xff0c;否则不显示必…...

搭建高性能分布式存储-minio

文章目录 搭建高性能分布式存储-minioDocker搭建minio&#xff08;单机部署纠删码模式&#xff09;⭐创建minio的bucket&#xff08;桶&#xff09;⭐SpringBootminio项目实战 ⭐1&#xff1a;导入minio的maven依赖2&#xff1a;编写MinioProperties.class3&#xff1a;applica…...

leetCode 137. 只出现一次的数字 II(拓展篇) + 模5加法器 + 真值表(数字电路)

leetCode 137. 只出现一次的数字 II 题解可看我的往期文章 leetCode 137. 只出现一次的数字 II 位运算 模3加法器 真值表&#xff08;数字电路&#xff09; 有限状态机-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134138112?spm1001.2014.3001.5501…...

docker导致root空间满进入不了系统解决方案

由于docker建立镜像会产生很多缓存文件&#xff0c;最终导致root目录满&#xff0c;进入不了系统 df -h docker默认路径是在/var/lib/docker下 可以通过命令查看docker占用空间 docker system df 如果占用空间太大 可用以下命令清理 $ docker image prune -h Flag shorth…...

uni-app遮罩遮住小程序tabbar

uni-app遮罩遮住小程序tabbar 1、用uni-app自带的方法显示隐藏 //通过弹窗显隐控制导航栏的显示和隐藏 const popupChange e >{if(e.show){//隐藏tabbaruni.hideTabBar()}else{//显示tabbaruni.showTabBar()}state.searchIcon e.show } //通过弹窗显隐控制导航栏的显示和…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...