如何创建一个包含多个工作表的Excel工作簿,其中每个工作表都是一个数据框

时间:2015-08-07 10:52:42

标签: r excel

我必须计算相对于1个变量(a)的50个变量(分类)的汇总 在找到之后,我想在一个excel工作簿中创建50张纸,每张纸看起来像: “变量名”a   1 10   2 21   3 18   。   

等等。

我能够创建50个csv,然后将它们合并到1个工作簿中,但这是一个很长的过程。 我想要的是获得一个循环将运行的函数,将计算聚合,然后写入工作簿中的工作表;这样做50次(变量)

包: - 我使用了WriteXLS。

1 个答案:

答案 0 :(得分:0)

这是一个包含两个步骤的解决方案:1)将每个变量的摘要统计信息作为列表中的单独数据框,然后2)将该列表的元素作为单独的工作表写入Excel工作簿。我使用iris作为测试平台,并使用xlsx代替WriteXLS,因为它使附页更容易。

library(dplyr)
library(lazyeval)
library(xlsx)

# Start with a function to get your summary stats by id
aggregateit <- function(x) {
    require(dplyr)
    require(lazyeval)
    result <- iris %>%  # need to name your initial df here
        group_by(Species) %>%  # need to name your id var here
        summarise_(mean = interp(~mean(var), var = as.name(x)))  # See http://stackoverflow.com/questions/26724124/standard-evaluation-in-dplyr-summarise-on-variable-given-as-a-character-string
    return(result)
}

# Now apply that function to all desired variables --- here, all non-id columns in iris,
# which are columns 1 through 4 --- and then assign the variables names to the elements
# of that list.
agglist <- lapply(names(iris)[1:4], aggregateit)
names(agglist) <- names(iris)[1:4]

# Now write the data frames in that list to a workbook with nice names for the sheets
for (i in 1:length(agglist)) write.xlsx(agglist[[i]], file="filename.xlsx",
    sheetName=names(agglist)[i], append=TRUE)

这是一个在初始函数中使用aggregate的版本,因此如果您愿意,可以在基数R中执行整个操作:

aggregateit <- function(variable) {
    var.mean <- aggregate(variable ~ Species, iris, FUN=function(x) mean(x))  # need to swap in your df and id var names
    var.sd <- aggregate(variable ~ Species, iris, FUN=function(x) sd(x)) # ditto
    result <- merge(var.mean, var.sd, by = "Species")  # again for id var
    names(result) <- c("Species", "mean", "sd")  # once more
    return(result)
}

agglist <- lapply(iris[,1:4], aggregateit)

for (i in 1:length(agglist)) write.xlsx(agglist[[i]], file="iris.sumstats.xlsx",
    sheetName=names(agglist)[i], append=TRUE, row.names = FALSE)