我必须计算相对于1个变量(a)的50个变量(分类)的汇总 在找到之后,我想在一个excel工作簿中创建50张纸,每张纸看起来像: “变量名”a 1 10 2 21 3 18 。
等等。
我能够创建50个csv,然后将它们合并到1个工作簿中,但这是一个很长的过程。 我想要的是获得一个循环将运行的函数,将计算聚合,然后写入工作簿中的工作表;这样做50次(变量)
包: - 我使用了WriteXLS。
答案 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)