【问题标题】:Trying to create a loop to export excel files from a list of data尝试创建一个循环以从数据列表中导出 excel 文件
【发布时间】:2018-09-20 22:01:11
【问题描述】:

我有一个数据列表(150 个学生姓名 + 班级 + 年级),我正在尝试按 class 创建 Excel 表格。我目前有一个按班级划分的数据列表,但我无法将它们导出到 Excel 中。

IncomingClasses <- split(Students, Students$Class-Course)
classes <- names(IncomingClasses)

for (i in seq(classes)){
    assign(classes[i], IncomingClasses[[i]])
    write.xlsx(IncomingClasses[i], file = paste(i, ".xlsx"))
}

但我无法导出。我得到的最好的错误信息是:

  • 错误(函数(...,row.names = NULL,check.rows = FALSE,check.names = TRUE,:参数暗示不同的行数:34, 44、15、17、16、18

因为我应该有不同的行,因为每个班级有不同的学生......但它不会创建 .xlsx 文档。

请帮忙!

【问题讨论】:

  • 这里的一条重要信息是您正在使用几个 Excel R 包中的哪一个。 xlsx? XL 连接?打开xlsx?写xl?还有什么?
  • 试试这个library(tidyverse); IncomingClasses %&gt;% split(.$Class-Course) %&gt;% walk2(names(.), ~ write_csv(.x, paste0(.y, '.csv')))

标签: r export-to-excel


【解决方案1】:

假设我有这个数据框,用这些变量初始化。

student <- c('joe', 'bob', 'foo', 'bar')
class <- c('1', '2', '3', '4')
grade <- c('a', 'b', 'c', 'd')
df <- data.frame(student, class, 

为什么不创建一个临时数据框并将其保存到文件中,并为具有正确类名称的条目提供适当的子集?

for (c in unique(df$class)) {
    tdf <- df[df$class == c, ]
    write.csv(tdf, file = paste(c, ".csv"))
}

【讨论】:

    【解决方案2】:

    您没有提供完全可重现的问题示例,因此很难诊断,但我发现至少有三个问题。要访问拆分的数据帧,您应该使用[[,而不是[,您使用seq 将产生编号的文件名,您应该使用paste0 而不是paste,以避免插入空格在文件名中。此外,assign 的使用令人困惑。我可以建议:

    for (i in names(IncomingClasses)) {
      write.xlsx(IncomingClasses[[i]], file = paste0(i, '.xlsx'))
    }
    

    【讨论】:

    • 然而,它将编写单独的文件,而不是像 OP 请求那样单独的工作表。
    • 点了,但 OP 的代码中没有任何内容建议在同一个文档中使用单独的工作表,我听说人们使用术语“工作表”来指代整个工作簿(即使那是 技术上错误)。
    • 使用assign的目的是在R中创建不同的数据框。我每次使用这段代码时都会导入不同的数据集,所以我尽量让它通用。我尝试了推荐的代码 + 现在我得到 mapply(setCellValue, cells[seq_len(nrow(cells)), colIndex[ic]], 错误:零长度输入不能与非零输入混合长度,因为第一组班级没有学生。
    • 这些类型的操作很少需要 assign。如果您打算对多个对象应用相同的操作,最好将对象包含在列表中并使用对列表成员进行操作的函数。 split 会生成这样一个列表。
    • 对,assign 基本上仅在您要以编程方式构造对象/对象名称时才需要:assign(paste0("test_", "mtcars"), mtcars) 的基本示例创建一个名为 test_mtcars 的对象,其数据为 mtcars .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2020-02-07
    • 2022-06-10
    相关资源
    最近更新 更多