如何将 excel 文件命名为 R 列表中数据框的名称

How to name excel files as the names of the data frames in a list in R

我有一个包含 100 多个数据框的大列表。为了简化,我显示了一个包含三个数据框(虚拟数据)的列表。我想使用 openxlsx 将每个数据帧写入一个 excel 文件。我已经创建了一个循环,其中每个数据框都在 excel 文件中,但我想将每个 excel 文件命名为数据框的名称。如何让每个 excel 文件命名为列表中的数据框? 所以 DF1 应该变成 DF1.xlsx。 DF2 应该变成 DF2.xlsx。 DF 在每个 excel 文件名称为 1,2 或 3 时应变为 DF3.xlsx.But。 我的循环:

for (i in (1:3)) {write.xlsx(listDF[i],file=paste(i,".xlsx"))}
# dummy data
listDF <- list(
  DF1 = data.frame(
    sample = c("TGX", "TGX", "TGX", "TGX"),
    RC = c(0, 1, 2, 3),
    medRC = c(0, 3, 4, 0),
    RC.norm = c(0, 3, 3, 3),
    medRC.norm = c(0, 3, 3, 3)
  ),
  DF2 = data.frame(
    sample = c("TBF", "TBF", "TBF", "TBF"),
    RC = c(2, 1, 2, 3),
    medRC = c(4, 3, 4, 0),
    RC.norm = c(1, 3, 3, 3),
    medRC.norm = c(0, 3, 3, 3)
  ),
  DF3 = data.frame(
    sample = c("TZW", "TZW", "TZW", "TZW"),
    RC = c(4, 3, 2, 3),
    medRC = c(1, 3, 2, 0),
    RC.norm = c(1, 1, 1, 1),
    medRC.norm = c(0, 7, 5, 3)
  )
    listDF 

    # $DF1
    #   sample  RC medRC RC.norm medRC.norm
    # 1  TGX    0     0       0          0
    # 2  TGX    1     3       3          3
    # 3  TGX    2     4       3          3
    # 4  TGX    3     0       3          3

    # $DF2
    #   sample RC medRC RC.norm medRC.norm
    # 1  TBF   2     4       1       0
    # 3  TBF   1     3       3       3 
    # 4  TBF   2     4       3       3
    # 5  TBF   3     0       3       3

    # $DF3
    #   sample  RC medRC RC.norm medRC.norm
    # 1  TZW    4     1       1          0
    # 2  TZW    3     3       1          7
    # 3  TZW    2     2       1          5
    # 4  TZW    3     0       1          3

可以使用 names()

访问列表元素的名称
names(listDF)
[1] "DF1" "DF2" "DF3"

您的循环需要修改为:

for (i in (1:3)) {write.xlsx(listDF[i],file=paste0(names(listDF)[i],".xlsx"))}

另请注意,使用 paste 会在您的 DF 名称和 .xlsx 之间生成一个空格。使用 paste0 丢弃空格。

您可以使用 purrrimap 来访问数据和名称。

purrr::imap(listDF, ~openxlsx::write.xlsx(.x, paste0(.y, '.xlsx')))

或在基础中使用 Map

Map(openxlsx::write.xlsx, listDF, paste0(names(listDF), '.xlsx'))

要从 R 中的列表中检索名称,您可以 运行:

df_names <- names(listDF)

然后你可以在你的循环中使用它们:

for (i in (1:length(listDF))) {
  write.xlsx(listDF[[i]],
             file = paste0(df_names[i], ".xlsx"))
}

请注意,您可以将数据框称为 listDF[[]](对 return 一个 data.frame,而不是列表,请参阅 documentation) and it's generally better to store files without spaces, so use paste0 instead of paste (see the documentation)。

lapply

如果您想使用 lapply,可能需要编写类似 lapply(listDF, function(i) {...}) 的函数,其中 i 是您的数据框。

或者,您可以像这样遍历索引并在 lapply 中获取数据帧名称:

lapply(seq_along(listDF),
       function(i) {write.xlsx(listDF[[i]],
                      paste0(names(listDF)[[i]], ".xlsx"))
                   }
)