0

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

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
4

3 回答 3

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丢弃空格。

于 2020-06-01T07:41:21.843 回答
2

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

df_names <- names(listDF)

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

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

请注意,您可以将数据框称为listDF[[]](要返回 data.frame,而不是列表,请参阅文档),并且通常最好存储没有空格的文件,因此请使用paste0而不是paste(请参阅文档)。

应用

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

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

lapply(seq_along(listDF),
       function(i) {write.xlsx(listDF[[i]],
                      paste0(names(listDF)[[i]], ".xlsx"))
                   }
)
于 2020-06-01T07:59:33.753 回答
2

您可以使用purrr'simap来访问数据和名称。

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

或在基地使用Map

Map(openxlsx::write.xlsx, listDF, paste0(names(listDF), '.xlsx'))
于 2020-06-01T07:43:56.573 回答