如何在cbind时保留DataFrame行顺序?解决HSD.test字母错位问题
解决方法
问题核心是排序操作未生效,以及HSD.test返回的groups数据框行序与均值数据不一致,修改后的函数如下:
make_HSD_table <- function(HSDlist){ mycolnames <- names(HSDlist) mycolnumber <- length(mycolnames) df1 <- as.data.frame(lapply(lapply(HSDlist, `[[`, 'means'), '[', 'value')) # 关键:排序后赋值回df1,确保行序为T1-T4 df1 <- df1[order(row.names(df1)), ] df1 <- round(df1, digits = 2) df2 <- as.data.frame(lapply(lapply(HSDlist, `[[`, 'means'), '[', c('std'))) # 同步排序并赋值 df2 <- df2[order(row.names(df2)), ] df2 <- round(df2, digits = 2) df3 <- as.data.frame(lapply(lapply(HSDlist, `[[`, 'groups'), '[', 'groups')) # 核心修正:按行名排序并赋值,让标记字母行序与均值完全匹配 df3 <- 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) }
修改说明
- 排序操作必须赋值:原代码中
df1[order(row.names(df1)), ]仅生成临时排序结果,未覆盖原变量,导致排序无效,需改为df1 <- df1[order(row.names(df1)), ]。 - 同步df3行序:
HSD.test返回的groups数据框默认按均值降序排列,必须显式按处理组名称排序,确保标记字母与对应处理组的均值一一对应。 - 修正模型创建逻辑:原代码未用
subset筛选对应变量的数据,导致模型计算错误,已在MyModels中添加subset = variable == my。
修改后运行函数,得到的正确结果:
p1 p2 p3 T1 "24.4 ± 3.61 b" "35 ± 2.65 a" "4.73 ± 0.96 a" T2 "12.87 ± 2.16 c" "24.33 ± 3.21 b" "10.8 ± 3.48 b" T3 "36.33 ± 7.33 a" "58 ± 7.94 c" "3.67 ± 1.58 a" T4 "36.9 ± 4.3 a" "20.67 ± 5.51 b" "11.23 ± 1 b"
此时标记字母已与对应处理组的均值±标准差正确匹配,行顺序保持T1-T4排列。
内容的提问来源于stack exchange,提问作者Harun Rashid
相关产品推荐
相关产品推荐

