- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 12 个
- 通用积分
- 8.0000
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 116 点
- 帖子
- 3
- 精华
- 0
- 在线时间
- 18 小时
- 注册时间
- 2016-5-26
- 最后登录
- 2022-3-5
|
修正了新版本agricolae程序包(1.2-7及以上)不能适用的bug, 并增加了特性(自动安装依赖包,不指定alpha值则进行0.05和0.01水平比较并合并两个结果,新参数:记住上次复制到剪贴板的数据,新参数:转换为大写字母):
- ##
- ## 单因素方差分析+Duncan多重比较 快速标记字母 (for Windows)
- ##
- ## Mac OS X: 将两处"clipboard"替换为pipe("pbcopy")和pipe("pbpaste;echo"),见注释
- ##
- ## 测试环境:R: 3.2.1 ; 程序包:agricolae 1.2-8 ; Windows XP
- ##
- ## 帮助: fhelp()
- ##
- ## FGM 2018-1-25 why_fish@126.com
- ##
- ##
- ##检测并安装“agricolae”
- fgm_required_pkg="agricolae"
- if(!fgm_required_pkg %in% rownames(installed.packages())){
- message("没有找到需要的程辑包:", fgm_required_pkg,",准备开始安装... 要自行安装请键入“install.packages(\"", fgm_required_pkg, "\")”。\n\n")
- install.packages(fgm_required_pkg)
- }
- library(agricolae)
- lstAgricolaeVer = packageVersion ("agricolae")
- global_com_fgm_duncanalm_lastreaddata=NA
- if (lstAgricolaeVer > "1.2.8"){
- message("警告:程辑包‘agricolae’", as.character(lstAgricolaeVer), "版本过高,脚本可能无法支持( 大于'1.2-8' )\n\n")
- }
- copy_to_clipboard = function(x,sep="\t",col.names=T,...) {
- write.table(x
- ,file = "clipboard" # Mac: pipe("pbcopy")
- ,sep=sep
- ,col.names = col.names
- ,row.names = F
- ,quote = F,...)
- }
- paste_from_clipboard = function(sep="\t",header=T,...) {
- read.table("clipboard" # Mac: pipe("pbpaste;echo")
- ,sep=sep
- ,header=header,...)
- }
- fhelp <- function() {
- cat("\n",rep("#",2),"单因素方差分析+Duncan多重比较\n ")
- cat(rep("#",2),"使用方法: 从Excel复制纯数据区域,键入f()(或参考下面示例),回车执行,粘贴字母标记结果回Excel;\n",rep("#",2),"数据分组:【按行】; 字母标记:【降序】;\n",rep("#",2),"\n ")
- cat(rep("#",2),"例 (注意大小写,使用英文标点):\n ")
- cat(rep("#",2),"f() 得到在alpha=0.05和0.01两个水平上比较的结果\n ")
- cat(rep("#",2),"f(0.01) 0.01水平上比较(自动转为大写字母)\n ")
- cat(rep("#",2),"f(alpha = 0.01, uselastdata = TRUE) 使用上次从Excel复制进剪贴板的数据再在0.01水平上比较\n ")
- cat(rep("#",2),"f(alpha = 0.02, uppercase = TRUE) 使用“uppercase = TRUE”指定输出结果为大写字母\n ")
- cat(rep("#",2),"fhelp() 显示帮助\n ")
- }
- com_fgm_duncanalm_getmarks <- function(fgm_resultaov, fgm_level, fgconsole = TRUE, fgalpha = 0.05) {
-
- duncanresult = duncan.test(fgm_resultaov,fgm_level,console=fgconsole, alpha=fgalpha)
- de=as.data.frame(duncanresult["groups"])
-
- if (lstAgricolaeVer >= "1.2.7"){
- deres=de[order(as.integer(row.names(de))), ]
- deres=as.data.frame( deres[,"groups.groups"])
- }else{
- deres=de[order(de[,"groups.trt"]), ]
- deres=as.data.frame( deres[,"groups.M"])
- ### fixed a bug: 旧版本的agricolae包适用
- }
- return(deres)
-
- }
- f <- function(alpha = 0.05, uselastdata = FALSE, uppercase = NA) {
-
- if(uselastdata==FALSE){
- global_com_fgm_duncanalm_lastreaddata <<- paste_from_clipboard(header = FALSE)
- }
- dff = global_com_fgm_duncanalm_lastreaddata
- cat("\n\n")
- cat("处理的水平数:", nrow(dff))
- cat("\t重复数:", ncol(dff),"\n")
-
- x <- as.vector(t(dff))
- ### 数据若按列分组则为:as.vector(as.matrix(dff))
-
- level = factor(rep(1:nrow(dff),each=ncol(dff)))
- df = data.frame(x,level)
- resultaov = aov(x~level,data=df)
-
- if(missing(alpha)) {
- ## 默认: 执行0.05(小写字母)和0.01(大写字母),合并结果
- detocopy1 = com_fgm_duncanalm_getmarks(resultaov,"level",fgconsole = TRUE, fgalpha = 0.05)
- detocopy = com_fgm_duncanalm_getmarks(resultaov,"level",fgconsole = TRUE, fgalpha = 0.01)
- detocopy[,1] = toupper(detocopy[,1])
- detocopy[,1] = paste0(detocopy1[,1] , detocopy[,1])
- }else{
- detocopy = com_fgm_duncanalm_getmarks(resultaov,"level",fgconsole = TRUE, fgalpha = alpha)
- if( isTRUE(uppercase) || (is.na(uppercase) && (alpha==0.01))){
- ## 自动:0.01 水平改为大写字母
- detocopy[,1] = toupper(detocopy[,1])
- }
- }
-
- copy_to_clipboard( detocopy,col.names = FALSE)
- cat("\n\n",rep("#",30),"\n",rep("#",5), " 已复制字母标记(按原数据区域顺序)到剪贴板。 ",rep("#",5),"\n",rep("#",30),"\n\n")
-
- }
- fhelp()
复制代码
如有后续更新,请点击“只看作者”。
|
|