入门必学 | 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循环中添加判断语句嵌套循环 在上一节中,我们介绍了迭代与for循环,并对for循环的结构与原理进行了深入的介绍。在这一节中,我们将分享for循环的常规应用,包括在其中加入判断语句与嵌套循环。 何为判断语…...

metaRTC集成flutter ui demo编译指南
概要 Flutter是由Google开发的开源UI工具包,用于构建跨平台应用程序,支持linux/windows/mac/android/ios等操作系统。 metaRTC新增flutter demo,支持linux/windows/mac/android/ios操作系统,此demo在ubuntu桌面环境下测试成功。…...
int怎么转成QString?
2023年10月31日,周二晚上 要将 int 类型转换为 QString,可以使用 QString::number() 方法。 下面是一个示例代码: int number 123; QString str QString::number(number);还可以在转换时指定进制,比如将整数转换为十六进制的字…...
JavaScript进阶(二十九): 走近 es6 之 new.target
文章目录 一、前言二、new.target 重写三、拓展阅读 一、前言 源码阅读过程中,发现以下语句 new.target.prototype鉴于该语法为es6所有,项目在编译过程中,控制台报Unexpected token: punc(.)错误。按照常规处理,应用babel-loade…...

JVM虚拟机:堆结构的逻辑分区
堆内存的逻辑分区 堆内存的逻辑分区如下所示: 堆内存中分为新生代和老年代,二者空间大小1:3。在新生代里面分为两类区域(eden、survivor),三个区域(eden、survivor、survivor),三个区大小比例为8:1:1。 对象存放的位置 栈 当我们new一个对象的时候,首先会将对象…...
RabbitMQ学习02
Hello World(Java) 1.导入依赖 <!--指定 jdk 编译版本--><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration&g…...

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

思维训练第三课 反意疑问句
系列文章目录 文章目录 系列文章目录前言一、什么是反意疑问句二、反意疑问句的回答💚主系表/主谓宾(肯定),否定提问1、一般现在时2、一般过去时3、一般将来时4、现在完成时 💛 主谓宾1、一般现在2、一般过去3、一般将…...

nvm安装步骤
注意事项 不要安装任何版本的node.js,有的话卸载干净!注意:要卸载干净了! 安装步骤: nvm下载 点击exe文件安装 安装目录选择:D:\NVM 下一步创建nodejs文件放在D:\NVM 下,然后一直next到最后 …...
关于比较级(内含名词比较级)
在比较级中,修饰形容词一般使用more 或者-er的变体,但是怎么修饰名词呢? 即,如果我们想表达:你能不能表现得更马屁精一点?这种针对一个具体名词的程度升级怎么表达呢? 使用be more of 名词的…...
【算法|动态规划 | 线性dp | 最长上升子序列模型No.1】AcWing1017.怪盗基德的滑翔翼 AcWing1014.登山
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【AcWing算法提高学习专栏】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家…...

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

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

SpringBoot的核心配置:YAML概述、基础语法;JSR303数据校验;多环境切换
SpringBoot核心配置 SpringBoot配置文件分类 SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用 application.properties或者application.yml(application.yaml)进…...

把Qt6.2.4内置的标签打印了一遍
2023年10月31日,周二晚上 #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 表单校验的规则如下: <属性名>: [{ required: true,// 是否必填(若有label则在其左上角显示红点,否则不显示必…...

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

leetCode 137. 只出现一次的数字 II(拓展篇) + 模5加法器 + 真值表(数字电路)
leetCode 137. 只出现一次的数字 II 题解可看我的往期文章 leetCode 137. 只出现一次的数字 II 位运算 模3加法器 真值表(数字电路) 有限状态机-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134138112?spm1001.2014.3001.5501…...
docker导致root空间满进入不了系统解决方案
由于docker建立镜像会产生很多缓存文件,最终导致root目录满,进入不了系统 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 } //通过弹窗显隐控制导航栏的显示和…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...