我正在尝试创建一个函数,用于根据agricolae
包中HSD.test
的结果创建一个整洁的表格。HSD.test
的输出是一个列表,其中治疗字母按平均值的降序排序。我想按T1、T2 ......等排列“平均值± sd字母”。尽管平均值和sd是这样排列的,字母没有按照顺序排列。2我不能用下面的函数完成下面的操作,因为字母没有正确地与处理对齐(下面每个数据框中的行名称)。3我到处搜索,并试图收集代码片段来制作这个函数。
如何在cbind
ing期间保持df3
行的顺序?
MyDf<-data.frame(treatment = rep(c('T1','T2','T3','T4'), each = 3),
p1 = c(28.5, 21.7, 23.0, 14.9, 10.6, 13.1, 41.8, 39.2, 28.0, 38.2, 40.4, 32.1),
p2 = c(32, 37, 36, 23, 28, 22, 67, 52, 55, 18, 27, 17),
p3 = c(5.6, 3.7, 4.9, 7.1, 11.3, 14, 2.3, 5.4, 3.3, 11.6, 10.1, 12)
)
MeltMyDf<-melt(MyDf)
MyDfSE<-summarySE(MeltMyDf, measurevar = "value", groupvars = c("variable", "treatment"))
x <- as.character(unique(MyDfSE$variable))
MyModels<-sapply(x, function(my) {lm(value~treatment, data=MeltMyDf, variable==my)}, simplify=FALSE)
MyGroups<- lapply(MyModels, function(m) HSD.test((m), "treatment", alpha = 0.05, group = TRUE, console = FALSE, variable==variable))
#---- the function I have created ------------
make_HSD_table<-function(HSDlist){
mycolnames<-names(HSDlist)
mycolnumber<-length(mycolnames)
df1<-as.data.frame(lapply(lapply(HSDlist, `[[`, 'means'), '[', 'value'))
df1[order(row.names(df1)), ]
df1<-round(df1, digits = 2)
df2<-as.data.frame(lapply(lapply(HSDlist, `[[`, 'means'), '[', c('std')))
df2[order(row.names(df2)), ]
df2<-round(df2, digits = 2)
df3<-as.data.frame(lapply(lapply(HSDlist, `[[`, 'groups'), '[', 'groups'))
df3[order(row.names(df3)), ]
myrownumber<-nrow(df1)
pm_df<-data.frame(replicate(mycolnumber, rep('±', myrownumber)))
my_table <- cbind(df1, pm_df, df2, df3)[order(c(seq_along(df1), seq_along(pm_df),seq_along(df2), seq_along(df3)))]
my_table <- cbind(sapply(split.default(my_table, as.integer(gl(ncol(my_table), 4, ncol(my_table)))), function(x) do.call(paste, x)))
colnames(my_table)<-mycolnames
rownames(my_table)<-rownames(df1)
write.table(my_table, 'my_HSD_table.csv', append = F, sep = ',', row.names = FALSE)
return(my_table)
}
#-----------------------------------------
make_HSD_table(MyGroups)
p1 p2 p3
T1 "24.4 ± 3.61 a" "35 ± 2.65 a" "4.73 ± 0.96 a"
T2 "12.87 ± 2.16 ab" "24.33 ± 3.21 b" "10.8 ± 3.48 a"
T3 "36.33 ± 7.33 bc" "58 ± 7.94 bc" "3.67 ± 1.58 b"
T4 "36.9 ± 4.3 c" "20.67 ± 5.51 c" "11.23 ± 1 b"
**As you can see, the values±sd are sorted according to the treatment. But the letters are not sorted and placed with wrong mean±sd!**
1条答案
按热度按时间agxfikkp1#
最后,我可以修改我的函数,从
HSD.test
输出mean ± sd grouping_letter
表,该表按照 Dataframe 的顺序排序。现在,调用表的函数。它也将表导出为
csv
文件。让我们从
HSD.test
输出创建该表。正如您所看到的,这些字母已经被正确地分配给了相应的
mean±sd
列。