openxlsx2写入Excel异常:自动转DataFrame,如何按原表格格式写入?
问题描述
在R中通过以下代码生成带边际和的双向表格:
t <- table(df[["Sex"]], df[["C or Better"]], useNA = "ifany") colnames(t)[is.na(colnames(t))] <- "Blank" CountsBySex <- addmargins(t, c(1,2))
生成的表格打印格式正常:
> t C-, D or F Other Pass Blank F 1967 737 3169 106 M 1555 480 2452 71
但使用openxlsx2::wb_add_data()写入Excel时:
wb <- openxlsx2::wb_add_data(wb, sheet = cs, CountsBySex, start_col = 1, start_row = writeRow)
Excel中内容被转为长格式的DataFrame:
Var1 Var2 Freq 1 F C-, D or F 1967 2 M C-, D or F 1555 3 Sum C-, D or F 3522 4 F Other 737 5 M Other 480 6 Sum Other 1217 7 F Pass 3169 8 M Pass 2452 9 Sum Pass 5621 10 F Blank 106 11 M Blank 71 12 Sum Blank 177 13 F Sum 5979 14 M Sum 4558 15 Sum Sum 10537
openxlsx2会自动将表格转为长格式DataFrame写入,而openxlsx可保留原表格格式,需修改语法让openxlsx2按原格式写入Excel。
解决办法
openxlsx2的wb_add_data()对table类对象的处理逻辑和openxlsx不同,需要手动将表格转换为宽格式的DataFrame,再写入Excel。具体修改步骤:
- 将
CountsBySex转换为保留行列名的宽格式DataFrame:
# 转换为宽格式DataFrame,保留原表格列结构与数值 CountsBySex_df <- as.data.frame.matrix(CountsBySex) # 添加行标签列(对应原表格的行名) CountsBySex_df <- cbind(Row = rownames(CountsBySex_df), CountsBySex_df) # 重置DataFrame行名,避免写入Excel时多出默认行号 rownames(CountsBySex_df) <- NULL
- 使用转换后的DataFrame写入Excel:
wb <- openxlsx2::wb_add_data(wb, sheet = cs, CountsBySex_df, start_col = 1, start_row = writeRow)
原理说明
as.data.frame.matrix()会直接将table对象转换为宽格式DataFrame,完全保留原表格的列结构和数值,同时保留行名。- 手动添加
Row列是为了把原表格的行标签(F、M、Sum)作为单独一列写入Excel,最终效果和原表格打印格式完全一致。
内容的提问来源于stack exchange,提问作者Thomas Philips
相关产品推荐
相关产品推荐

