利用R语言生成区试中随机区组试验设计——多点

article/2025/7/1 23:08:10

目前,区试要求对照不得位于区组的首尾小区,且不同区组的相邻小区位置不得出现同一品种。基于这一要求,编写了R语言的随机区组试验设计。此函数可用于多个试验点试验设计生成情况。

        rcbd函数有6个参数:

local_name为试验点名称的向量,默认为NULL。当不为空时,local_num的数值将自动等于local_name向量的长度。

local_num表示试验点数量,默认只有一个试验点,与local_name是二选一的。

block表示区组数,默认单个试验点的区组数为3,也可以对不同试验点设置不同的区组数,此时用向量表示即可

varieties是品种列表,需要是字符向量

ck表示是否设置有对照,如果有,则将ck=对照名称

same默认为FALSE,表示要求单个试验点不同区组的同一小区位置不出现同一品种


# 自定义单点的随机区组设计
rcbd_loc1<-function(block=3,  # 默认区组数为3varieties,  # 品种列表,是字符向量ck=NULL,  # 设置对照,是字符串same=FALSE  # 默认同一个小区位置不出现同一品种){n<-length(varieties)  # 计算品种数量# 判断条件:如果n=0则函数报错,并跳出函数if(n==0) return("varieties参数中没有品种信息")# 定义一个列表,用于存放每次生成的随机品种组lst<-list()# 生成数据框中的数组编号blk<-rep(seq_len(block),each=n)# 生成数据框中每个区组中的小区编号plt<-rep(seq_len(n),times=block)if(is.null(ck)){  # 当不设置对照名称时if(same){  # 完全随机区组试验设计for(i in seq_len(block)){lst[[i]]<-sample(varieties,n,replace=FALSE)}}else{  # same为FALSE,表示同一小区位置不出现同一品种for(i in seq_len(block)){lst[[i]]<-sample(varieties,n,replace=FALSE)# 第一次生成的随机组不做任何要求# 后面所有生成的随机组都要与前面的随机组进行比较# 如果有相同的品种出现在同一小区位置,则重新生成随机组if (i!=1){for(j in seq_len(i-1)){while(any(lst[[j]]==lst[[i]])){lst[[i]]<-sample(varieties,n,replace=FALSE)}}}}}}else{  # 当设置有对照名称时,对照不出现在区组的首尾处# 判断ck是否在varieties中,如果不在则终止函数if(!ck%in%varieties) return("对照不在品种数据中")if(same){  # 允许在同一小区位置出现同一品种for(i in seq_len(block)){lst[[i]]<-sample(varieties,n,replace=FALSE)while(lst[[i]][1]==ck | lst[[i]][n]==ck){lst[[i]]<-sample(varieties,n,replace=FALSE)}}}else{  # 在同一小区位置不允许出现同一品种for(i in seq_len(block)){lst[[i]]<-sample(varieties,n,replace=FALSE)while(lst[[i]][1]==ck | lst[[i]][n]==ck){lst[[i]]<-sample(varieties,n,replace=FALSE)}# 第一次生成的随机组不做任何要求# 后面所有生成的随机组都要与前面的随机组进行比较# 如果有相同的品种出现在同一小区位置,则重新生成随机组if (i!=1){for(j in seq_len(i-1)){while(any(lst[[j]]==lst[[i]]) | lst[[i]][1]==ck | lst[[i]][n]==ck ){lst[[i]]<-sample(varieties,n,replace=FALSE)}}}}}}lst<-unlist(lst)df<-data.frame(blk,plt,lst)df
}# 多次调用的中间函数,用于在单个试验点的随机区组数据框上添加试验点信息
temp_func<-function(block,  # 区组数num0,  # 数字表示的试验点name0=NULL,  # 试验点名称varieties,  # 品种向量ck, # same){lc_num<-rep(num0,block*length(varieties))if (!is.null(name0)) lc_name<-rep(name0,block*length(varieties))temp_df<-rcbd_loc1(block,varieties,ck,same)if (class(temp_df)=="character"){return(paste("单点试验设计参数有误:",temp_df))}else{temp_df["loc_num"]<-lc_numif (!is.null(name0)) temp_df["loc_name"]<-lc_name}temp_df
}# 多点次的随机区组设计,需要调用单点次随机区组设计
rcbd<-function(local_name=NULL,local_num=1,  # 与local_name是二选一block=3,  # 默认单个试验点的区组数为3,也可以对不同试验点设置不同的区组数,此时用向量表示即可varieties,  # 品种列表,是字符向量ck=NULL,  # 设置对照,是字符串same=FALSE  # 默认同一个小区位置不出现同一品种){# 定义一个列表,用于存放每个试验点的随机区组数据lst_lc<-list()# 加载dplyr包,用于后面的数据框的合并library(dplyr)if(is.null(local_name)){  # 在local_name为空的情况下,直接调用local_numif(length(block)==1){  # 所有试验点区组数为固定值for (x in seq_len(local_num)){lst_lc[[x]]<-temp_func(block=block,num0=x,varieties=varieties, ck=ck, same=same)if (class(lst_lc[[x]])=="character") return(lst_lc[[x]])}}else{  # 不同试验点设置不同的区组数# 如果区组向量的长度与试验点数不一致,则报错if(length(block)!=local_num) return("区组向量的长度与试验点数不一致")for (x in seq_len(local_num)){lst_lc[[x]]<-temp_func(block=block[x],num0=x,varieties=varieties, ck=ck, same=same)if (class(lst_lc[[x]])=="character") return(lst_lc[[x]])}}}else{  # 如果local_name不为空,则local_num等于local_name的长度local_num=length(local_name)if(length(block)==1){  # 所有试验点区组数为固定值for (x in seq_len(local_num)){lst_lc[[x]]<-temp_func(block=block,num0=x,name0=local_name[x], varieties=varieties, ck=ck, same=same)if (class(lst_lc[[x]])=="character") return(lst_lc[[x]])}}else{  # 不同试验点设置不同的区组数# 如果区组向量的长度与试验点数不一致,则报错if(length(block)!=local_num) return("区组向量的长度与试验点数不一致")for (x in seq_len(local_num)){lst_lc[[x]]<-temp_func(block=block[x],num0=x,name0=local_name[x], varieties=varieties, ck=ck, same=same)if (class(lst_lc[[x]])=="character") return(lst_lc[[x]])}}}# 将列表中的各试验点的数据框合并为一个数据框# 调用dplyr包的bind_rows()函数combined_df <- bind_rows(lst_lc)combined_df
}# 录入参数
varieties<-c("A","B","C","D","E")
local_name<-c("地点1","地点2","地点3")# 调用函数,常用设置
rcbd(local_name=local_name, block=3, varieties=varieties, ck="C", same=FALSE)

如果要生成(地点、小区)×区组的二维表,使用下述代码:

# 生成(地点、小区)×区组的二维表
df<-rcbd(local_name=local_name, block=3, varieties=varieties, ck="C", same=FALSE)
library(reshape2)
dcast(df,loc_name+plt~blk,value.var="lst")
dcast(df,loc_name+blk~plt,value.var="lst")

 


http://www.hkcw.cn/article/AaOYBwLGuw.shtml

相关文章

pytorch基本运算-范数

引言 前序学习进程中&#xff0c;已经对pytorch基本运算有了详细探索&#xff0c;文章链接有&#xff1a; 基本运算 广播失效 乘除法和幂运算 hadamard积、点积和矩阵乘法 上述计算都是以pytorch张量为运算元素&#xff0c;这些张量基本上也集中在一维向量和二维矩阵&#x…

STM32G4 电机外设篇(四)DAC输出电流波形 + CAN通讯

目录 一、STM32G4 电机外设篇&#xff08;四&#xff09;DAC输出电流波形 CAN通讯1 DAC输出电流波形1.1 STM32CubeMX配置和Keil代码1.2 实验现象 2 CAN/CANFD通讯2.1 STM32CubeMX配置和Keil代码2.2 实验现象 附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^) 一、STM32G4 电机…

电子电气架构 --- 后轮转向的一点事情

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 做到欲望极简&#xff0c;了解自己的真实欲望&#xff0c;不受外在潮流的影响&#xff0c;不盲从&#x…

web复习(四)

盒子模型的例题 例一&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>咖啡店banner</title> <style type"text/css"> /*将页面中所有元素的内外边距设置为0*/ *{ padding:0; margin…

Cesium添加点线面(贴地)

// 创建一个图元集合const primitives viewer.scene.primitives.add(new Cesium.PrimitiveCollection());1、点上图 // 定义点的位置&#xff08;中国不同城市的经纬度&#xff09;const points [{ lon: 116.4074, lat: 39.9042, name: "北京" },{ lon: 121.4737, …

技术文档:MD520系列变频器配套杭州干扰净GRJ9000S系列EMC电源滤波器安装指南

1. 引言 MD520系列通用变频器是汇川技术有限公司&#xff08;Inovance&#xff09;设计的高性能电流矢量控制交流驱动器&#xff0c;广泛应用于纺织、造纸、机床、包装、食品、风机和水泵等行业。为确保其在复杂电磁环境中稳定运行并不对其他设备造成干扰&#xff0c;手册推荐…

【基于阿里云搭建数据仓库(离线)】DataWorks中删除节点

1.右击想要删除的节点&#xff0c;点击删除 2. 显示如下界面&#xff0c;点击“去下线” 3.进入到如下界面&#xff0c;点击红色框出来的 4.重新右击想要删除的目标节点&#xff0c;点击删除 5. 点击去下线 6.点击开始下线 7.点击“确认发布” 8.点击“确认” 9.点击“重新删除…

【GESP真题解析】第 6 集 GESP 三级 2023 年 9 月编程题 1:小杨的储蓄

大家好,我是莫小特。 这篇文章给大家分享 GESP 三级 2023 年 9 月编程题第 1 题:小杨的储蓄。 题目链接 洛谷链接:B3867 小杨的储蓄 一、完成输入 根据输入格式的描述,输入有两行,第一行为两个整数 N 和 D,数据范围: 1 ≤ N ≤ 1000 1\le N \le 1000 1≤N≤1000, 1 …

MySQL-多表关系、多表查询

一. 一对多(多对一) 1. 例如&#xff1b;一个部门下有多个员工 在数据库表中多的一方(员工表)、添加字段&#xff0c;来关联一的一方(部门表)的主键 二. 外键约束 1.如将部门表的部门直接删除&#xff0c;然而员工表还存在其部门下的员工&#xff0c;出现了数据的不一致问题&am…

Arbitrum Stylus 合约实战 :Rust 实现 ERC721

在上一篇中&#xff0c;我们学习了如何在 stylus 使用 rust 编写 ERC20合约&#xff0c;并且部署到了Arbitrum Sepolia &#xff0c;今天我们继续学习&#xff0c;如何在 stylus 中使用 rust 实现 ERC721 合约&#xff0c;OK, 直接开干&#xff01; 关于环境准备&#xff0c;请…

超声波测距三大算法实测对比

前言 声波测距的数据包含很大噪声&#xff0c;即使障碍物&#xff08;以纸板为例&#xff09;静止&#xff0c;测量距离数据也上下跳变&#xff0c;需要通过数据滤波算法降低测量误差&#xff0c;主要滤波算法有平均值滤波和卡尔曼滤波。 在超声波测距中&#xff0c;无滤波、…

【2025年5月】AI生产力再探再报:各家智能体持续内卷,前沿应用不断细分

前言 2025年5月的个人学习笔记。 一、工具尝鲜快报&#xff1a;初探感觉好玩&#xff0c;但还未深入的工具。 二、生产力军火库&#xff1a;开箱即用的神器&#xff0c;以及一些好用的技巧。 三、前沿动态速递&#xff1a;一些可反复品读的优质资料和个人感兴趣的新工具。 文章…

ubuntu22.04安装megaton

前置 sudo apt-get install git cmake ninja-build generate-ninja安装devkitPro https://blog.csdn.net/qq_39942341/article/details/148388639?spm1001.2014.3001.5502 安装cargo https://blog.csdn.net/qq_39942341/article/details/148387783?spm1001.2014.3001.5501 …

shell脚本的条件测试

命令结果判定 && &#xff1a;在命令执行后如果没有任何报错时会执行符号后面的动作 || &#xff1a;在命令执行后如果命令有报错会执行符号后的动作 条件判断 # test 语句 # []&#xff0c;[[]]&#xff0c;(()) 语句 # [[]] 可以支持的表达式更多&#xff0c;是最常…

已有的前端项目打包到tauri运行(windows)

1.打包前端项目产生静态html、css、js 我们接下来用vue3 vite编写一个番茄钟案例来演示。 我们执行npm run build 命令产生的dist目录下的静态文件。 2.创建tarui项目 npm create tauri-applatest一路回车&#xff0c;直到出现。 3.启动运行 我们将打包产生的dist目录下的…

随记 nacos + openfegin 的远程调用找不到服务

这里的配置问题就不说了&#xff0c;基本的都没有问题&#xff0c;然后现在的是怎么样的场景呢&#xff0c;就是有两台服务器&#xff0c;两台服务器分别部署了两个模块&#xff0c;B要调用A服务&#xff0c;然后通过nacos找到了这个服务的名称&#xff0c;但是呢发现连不上&am…

【Python 算法零基础 4.排序 ⑦ 桶排序】

草木不争高&#xff0c;争的是生生不息 —— 25.5.26 选择排序回顾 ① 遍历数组&#xff1a;从索引 0 到 n-1&#xff08;n 为数组长度&#xff09;。 ② 每轮确定最小值&#xff1a;假设当前索引 i 为最小值索引 min_index。从 i1 到 n-1 遍历&#xff0c;若找到更小元素&am…

天机学堂-分页查询

需求 分页查询我的课表 返回&#xff1a; 总条数、总页数、当前页的课表信息的集合 返回的VO&#xff08;已经封装成统一的LearningLessonsVO&#xff09; 定义Controller RestController RequestMapping("/lessons") RequiredArgsConstructor public class Lear…

Transformer 是未来的技术吗?

之前的文章中&#xff0c;聊了不少关于 Transformer 方面的内容&#xff1a; Transformer 中的注意力机制很优秀吗&#xff1f;-CSDN博客初探 Transformer-CSDN博客来聊聊Q、K、V的计算-CSDN博客 现在的大模型基本都是基于 Transformer 或者它的演进技术&#xff0c;那么&…

阿里云国际站,如何通过代理商邀请的链接注册账号

阿里云国际站&#xff1a;如何通过代理商邀请链接注册&#xff0c;解锁“云端超能力”与专属福利&#xff1f; 渴望在全球化浪潮中抢占先机&#xff1f;想获得阿里云国际站的海量云资源、遍布全球的加速节点与前沿AI服务&#xff0c;同时又能享受专属折扣、VIP级增值服务支持或…