R dataframe含其他列时如何实现mean与sd交错排布
问题修正与实现方案
原有代码的报错原因
- 拼接逻辑完全错位:目标是将同一组的sd行放在对应mean行的下方(按行交错),但原代码的
rbind(dta2[1:3], dta2[3])是按列重复拼接,完全偏离需求 - 列引用错误:原代码拼接时未纳入sd列,反而重复取了mean列,加上
c()把数据拉成一维向量,最终dataframe的列结构完全错乱 - 语法隐患:
summarize后多写了无后续操作的%>%,会导致R等待后续管道表达式,直接运行会触发中断
可直接运行的实现代码
# 加载依赖包 library(dplyr) # 生成模拟数据 year <- rep(2014:2015, length.out = 10000) group <- sample(c(0,1,2,3,4,5,6), replace=TRUE, size=10000) value <- sample(10000, replace = T) dta <- data.frame(year = year, group = group, value = value) # 分组计算统计值,移除原代码多余的管道符 dta2 <- dta %>% group_by(year, group) %>% summarize(mean = mean(value), sd = sd(value)) # 数值保留两位小数 dta2[,3:4] <- round(dta2[,3:4], 2) # 给sd值添加括号 dta2$sd <- paste0("(", dta2$sd, ")") # 拆分两类行结构 # 1. 均值行:保留原分组列值,填入mean值 mean_part <- dta2 %>% select(year, group, stat = mean) # 2. 标准差行:与均值行顺序一一对应,分组列设为空值,匹配学术表格的排版习惯 sd_part <- dta2 %>% mutate( year = NA, group = NA, stat = sd ) %>% select(year, group, stat) # 按行交错拼接生成最终结果 dta3 <- data.frame( year = c(rbind(mean_part$year, sd_part$year)), group = c(rbind(mean_part$group, sd_part$group)), stat = c(rbind(mean_part$stat, sd_part$stat)) )
自定义调整说明
- 如果需要sd行也展示对应的year、group标签,只要删掉
sd_part里的year = NA, group = NA赋值,直接保留原分组列即可 - 由于分组计算时已经按year、group顺序排序,两类行的索引完全对应,不会出现数值错配
内容的提问来源于stack exchange,提问作者Stata_user
相关产品推荐
相关产品推荐

