【问题标题】:how to automatically rename a sheetname in a for loop (xlsx)如何在 for 循环中自动重命名工作表名称(xlsx)
【发布时间】:2014-11-19 17:40:05
【问题描述】:

我正在尝试构建一个循环,该循环自动对数据集进行子集化,进行大量计算,并将每个组的结果作为单独的工作表打印到 xlsx-workbook-file。它应该按照以下代码行:

library(xlsx)
clist <- c("group1", "group2", "group3")
for (i in clist) {
datasubset <- filter(data, group == i)

mean <- mean(datasubset)

results <- createWorkbook()
sheet.i <- createSheet(results, sheetName = paste("results", i, sep=" "))
addDataFrame(mean, sheet.i, startRow=1, startColumn=1, row.names = FALSE)
}

最后两行显然不起作用。问题是如何根据 i 的值来命名 sheet.i。例如:sheet.group1、sheet.group2 等。那么应该用什么代码替换“sheet.i”?还是有其他方法可以在不同的包或不同的方法中实现我的目标?

【问题讨论】:

  • 您会考虑使用 VBA 构建工作簿的解决方案吗?
  • 您应该将library(.) 调用发布到您正在使用的XL-R 连接包。似乎应该有某种 addWorkSheet 功能。您是否查看过您正在使用的软件包的帮助页面?
  • @BondedDust 你是对的,对不起,添加了库,我也对其他解决方案持开放态度,dsnt 必须使用 xlsx 包,重要的部分是将结果导出到 excel 中以便我可以发送它们给我的老板,因为循环函数内部正在进行大量计算,你在说什么帮助页面?文档?如果是的话,什么也没找到
  • @vpipkt 我不知道 VBA 是如何工作的,抱歉,谢谢!
  • 奇怪,....当我查看从help(pack=xlsx) 帮助页面链接的Worksheet 帮助页面时,我看到createSheet 描述。

标签: r xlsx


【解决方案1】:

上面的代码有很多问题需要修复才能正常工作,但我希望这将有助于解决这些问题:

library(xlsx)
x <- runif(900)
group <- rep(c('group1','group2','group3'),300)
df <- data.frame(x,group)

wb <- createWorkbook() #make workbook outside the loop. You only need 1 workbook
for ( i in c('group1','group2','group3')) {
  datasubset <- subset(df, group == i)

  mean <- data.frame(mean(datasubset[['x']])) #needs to be a dataframe to use addDataFrame

  sheet <- createSheet(wb , sheetName = sprintf('sheet.%s',i)) #make each sheet

  addDataFrame(mean, sheet, startRow=1, startColumn=1, row.names = FALSE) #add dataframe 'mean' to each sheet
}
saveWorkbook(wb, 'test.xlsx') #don't forget to save

你的所有工作表都得到了你的 excel!

这是我的输出:

【讨论】:

  • 我尝试了几乎相同的东西,但它不起作用,是的,我上面的代码不完整,我只是想说明问题是如何工作的,你的代码的问题是它覆盖了工作表并且确实不是每次都创建一个新工作表,所以工作簿内没有多个工作表,而只是最后一次循环运行的数据,所以在这种情况下是 group3
  • 我让它工作了,你只需要在每次运行结束时添加 rm(sheet) 通过循环,所以它会删除工作表然后它工作,最后,我编辑了你的代码在末尾添加 rm(sheet)
  • rm() 是多余的,因为它只是在每个循环中删除变量。当变量被覆盖时,无论如何都会发生这种情况。如您所见,代码在没有 rm() 的情况下也可以工作。
  • 你是对的,只是让它在没有 rm() 的情况下也能工作。非常感谢!所以基本上我的错误是做(i in clist)而不是你的for ( i in c('group1','group2','group3')),因为其余部分与我使用的代码相同,除了sprintf,但使用paste应该工作相同并在循环内创建工作簿,对?我只是想从我的错误中吸取教训,所以感谢任何提示和答案,
  • 不用担心 :) 我真的很高兴能够提供帮助。使用粘贴也应该没问题,但不要在循环内创建工作簿,因为它每次都会被覆盖,最后你只会得到最后一张表。这才是你正确的态度!我们都需要从错误中吸取教训。
猜你喜欢
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2012-12-06
相关资源
最近更新 更多