在tables 包中有一个名为write.csv.tabular 的函数,但是在您的示例中,lapply 语句中的表格数据被转换为类list,因此您实际上是在使用列表of 个表格对象,这与直接处理表格数据有很大不同。
class(data)
[1] "list"
list 包含 3 个表格对象,但它仍然是 list 类,这会混淆导出功能。
我将展示如何直接写出tabular 数据,然后继续使用tabular 对象中的list。
以下是从iris 数据集创建的表格数据示例:
require(tables)
tabular_data <- tabular( (Species + 1) ~ (n=1) + Format(digits=2)*
(Sepal.Length + Sepal.Width)*(mean + sd), data=iris )
write.csv.tabular(tabular_data, "tabular_data.csv")
回到最初的示例,我们需要在 R 中使用 Excel 包,例如 xlsx,并将列表项类从 tabular 转换为它可以处理的内容。由于tabular 不会直接转换为data.frame,我们可以使用data.frame.matrix,但需要做更多的工作来恢复您的列标题。
首先不用担心列标题:
library(tables)
library(xlsx)
varList <- 2:4
data <- lapply(varList,function(x,df,byVar){
tabular((Factor(df[[x]],paste(colnames(df)[x])) + 1) ~
((Factor(df[[byVar]],paste(byVar)))*((n=1) + Percent("col"))),
data= df)
},mtcars,"cyl")
data <- lapply(data, as.data.frame.matrix)
file <- paste("your_workbook.xlsx", sep = "")
write.xlsx(data[[1]], file, sheetName = "Sheet1")
write.xlsx(data[[2]], file, sheetName = "Sheet2", append = TRUE)
write.xlsx(data[[3]], file, sheetName = "Sheet3", append = TRUE)
现在,就列标题而言,让我们看一下您的一个表格列表项,我们会发现一开始确实没有创建正确的列名:
varList <- 2:4
data <- lapply(varList,function(x,df,byVar){
tabular((Factor(df[[x]],paste(colnames(df)[x])) + 1) ~
((Factor(df[[byVar]],paste(byVar)))*((n=1) + Percent("col"))),
data= df)
},mtcars,"cyl")
cyl
4 6 8
cyl n Percent n Percent n Percent
4 11 100 0 0 0 0
6 0 0 7 100 0 0
8 0 0 0 0 14 100
All 11 100 7 100 14 100
colLabels 属性是一个 3 行矩阵,而 colnames 只能是每列 1 个元素。所以,我们必须解决它。
?colLabels 中的示例只是将其子集为这 3 行中的 1 行的值,这使得某些列没有标题,即
colLabels(data[[1]]) <- colLabels(data)[1,]
或
colLabels(data[[1]]) <- colLabels(data)[3,]
等等
paste 和 gsub 可用于创建更完整的列名集,但没有将它们转换为特殊的 colLabels 类的功能,因此您希望将它们保留为字符串对象然后在将您的数据转换为data.frame.matrix、data.frame 或导出到 Excel 后,将相应工作表的字符串设置为 colnames。
labels <- paste(colLabels(data[[1]])[1,],
colLabels(data[[1]])[2,],
colLabels(data[[1]])[3,])
labels <- gsub("NA ","",labels)