【问题标题】:how to loop two loops one in another如何在另一个循环中循环两个循环
【发布时间】:2020-12-02 23:46:19
【问题描述】:

我有一个包含 10 个 data.frame 的列表 (lst1)。每个 data.frame 都有一个变量ID。我也有一个IDlist。这是一种我们可以创建循环代码的方法,这样我就可以生成一本包含这 10 个数据的 Excel 书,每张纸一个,IDlist 中有一个匹配 ID?

棘手的部分是我们需要遍历 IDlist 列表以及通过 lst1。有什么建议吗?

我编写了一些代码,但它不起作用。希望它可以让您对我想做的事情有所了解。

for (i in IDlist) {
  
  # create a workbook
  tempwb <- createWorkbook()
  
  for(j in seq_along(lst1)){

    # store the ID -specific subset of the dataset
     data.subset <-lst1[[j]] %>% filter(ID == i)

    # add worksheet
    addWorksheet(tempwb, sheetName = lst1[[j]])} # I want the sheetname= dataname, what should I do? mine should be wrong

## How can I load subset to each sheet?

    file.name <- paste0(i,".xlsx")

    ### save workbook
    saveWorkbook(tempwb, paste0(output_dir,file.name), overwrite = TRUE)
  }

【问题讨论】:

  • 如果可以的话分享代码。

标签: r


【解决方案1】:
library(tidyverse)
library(writexl)

lst1 <- list(data1 = mpg, data2 = mpg, data3 = mpg, `data4/\\bad name` = mpg)

# Remove any illegal characters from names:
names(lst1) <- names(lst1) %>% 
    stringr::str_replace_all("[:punct:]", " ")

IDlist <- mpg %>% pull(cyl) %>% unique

make_one_xlsx <- function(this_id){
    lst1 %>% map(~filter(., cyl == this_id)) %>% write_xlsx(paste0("ID_", this_id, ".xlsx"))
}

IDlist %>% map(make_one_xlsx)

【讨论】:

  • 感谢您的建议。您创建了一个包含 4 张纸的文件,每个 ID 一张。我想获得 4 个工作簿,每个 ID 一个。它将包含 4 个工作表,每个工作表对应 lst 中的每个数据,工作表名称是数据名称。 (我们可能需要将 4 mpg 命名为 mpg1、mpg2、mpg3、mpg4)。你能帮我解决这个难题吗?非常感谢。
  • 你运行代码了吗?对于 IDlist 中的每个 ID,您都会获得不同的文件。这就是map 所做的。我更新了答案以显示如何命名 excel 工作表。名称来自列表名称。
  • 我的错。它确实为每个 ID 创建了一个。它是一种用数据名称命名每个工作表的方法吗?如果 lst1 中有 4 个 data.frame,名称为 test1, result2,verify3,guess4,我该如何写入数据,以便工作簿中的 4 个工作表为 test1, result2,verify3,guess4
  • 你试过我更新的答案了吗?如果lst1 是命名列表,则这些名称将成为工作表名称。
  • 谢谢一百万。你的应该工作。但是当我运行它时,我得到了以下错误[WARNING]: workbook_add_worksheet(): worksheet name 'Medical/Surgical History' has error: Worksheet name cannot contain invalid characters: '[ ] : * ? / \' Error: Error in writexl: failed to create workbook In addition: Warning message: In write_xlsx(., paste0("ID_", Subject_id, ".xlsx")) : Truncating sheet name(s) to 31 characters 这是一种无需修改我的数据名称即可获得输出的方法吗?也许自动删除/
【解决方案2】:

您应该展示一些数据示例以获得更好的答案。

你可以使用xlsx

library('xlsx')


for(i in seq_along(lst1)){
    if(i == 1){
        append = FALSE
    } else{
        append = TRUE
    }
    write.xlsx(lst1[i], file='file_name.xlsx', 
               sheetName='get your id(sheet) name', append=append)
}

【讨论】:

  • 感谢您的建议。我的情况不同。我想为每个 ID 创建一个工作簿,每个工作簿中有 10 个工作表,对应于lst1 中的每个数据集所以我们需要先从 IDlist 循环,然后将每个带有 ID 过滤器的 data.frame 写入每个工作表。如果我们有 5 个 ID,那么我们将有 5 个工作簿,每个工作簿 10 张,总共 50 张。
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 2019-03-08
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
相关资源
最近更新 更多