【问题标题】:How to export multiple list of dataframes from R如何从 R 导出多个数据框列表
【发布时间】:2020-08-27 09:07:31
【问题描述】:

我想将我的 3 个列表中的所有数据框导出到单独的 '.txt' 文件中。 我有一个包含 3 个列表(list1、list2 和 list3)的列表“my_list”。

每个列表包含多个数据框。我想将 3 个列表的所有 dataframes 导出到单独的文件(r1_df1.txtr1_df2.txtr2_df3.txtr2_df4.txtr2_df5.txtr3_df6.txtr3_df7.txtr3_df8.txt

让我们创建一些数据框:

df1 <- data.frame(geneName = 1:3, EnsemblID = 4:6, position = c(654654654,654654,654654))
df2 <- data.frame(id = 1:3, sex = c("M", "F", "T"))
df3 <- data1 <- data.frame(x1 = 1:3, x2 = letters[1:3])
df4 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))
df5 <- data.frame(geneName = 1:3, EnsemblID = 4:6, position = c(65465,654654,987987))
df6 <- data.frame(id = 1:3, sex = c("C", "S", "T"))
df7 <- data1 <- data.frame(x1 = 1:3, x2 = letters[1:3])
df8 <- data.frame(z1 = c(3, 45, 1), p2 = c(6, 5, 4))

列表中的数据框

list1 <- list(df1, df2); names(list1) <- c("df1", "df2")
list2 <- list(df3,df4,df5); names(list2) <- c("df3", "df4", "df5")
list3 <- list(df6, df7, df8); names(list3) <- c("df6", "df7", "df8")

my_list 包含 3 个列表

my_list <- list(list1, list2, list3); names(my_list) <- c("r1", "r2", "r3")

将数据帧导出到单独的.txt 文件**

对于一个列表,我使用此代码

lapply(seq_along(list1),
       function(i) write.table(list1[[i]], 
                               paste0("r1_", names(list1)[i] , ".txt"),
                               row.names = FALSE, quote = FALSE, sep = "\t", dec = ","))

## r1_df1.txt
## r1_df2.txt
                           

如何一次对所有列表执行相同的操作?

我试过循环

for (i in seq_along(my_list)) {
    filename = paste("r_", names(my_list)[i], ".txt")
    write.table(my_list[[i]], filename, row.names = FALSE, quote = FALSE, sep = "\t", dec = "," )
}
    

我得到 3 个文件,每个文件都有绑定数据框,而不是单独的数据框。

【问题讨论】:

    标签: r list dataframe export lapply


    【解决方案1】:

    如果同时迭代名称和数据,这样做会更容易。

    purrr试试这个:

    library(purrr)
    
    imap(my_list, function(x, y) imap(x, 
               ~write.table(.x, paste0(y, '_', .y , ".txt"),
                row.names = FALSE, quote = FALSE, sep = "\t", dec = ",")))
    

    或者,如果您想将内容保存在基础 R 中:

    Map(function(x, y) {
      Map(function(p, q) {
        write.table(p, paste0(y, '_', q , ".txt"),
                   row.names = FALSE, quote = FALSE, sep = "\t", dec = ",")
      }, x, names(x))
    }, my_list, names(my_list))
    

    【讨论】:

    • 感谢的快速回答。我的列表中有时会有相同的数据框名称。 如何用子列表名称替换“r1_”。获取r1_df1r1_df2r2_df3r2_df4r2_df5r3_df6r3_df7r3_df8 的示例
    【解决方案2】:

    您可能希望 unlist 事先不递归。

    my_list.u <- unlist(my_list, recursive=F)
    for (i in seq_along(my_list.u)) {
        filename=paste0("r_", names(my_list.u)[i], ".txt")
        write.table(my_list.u[[i]], filename, row.names=FALSE, quote=FALSE, 
                    sep="\t", dec="," )
    }
    

    或者不使用 for 循环,使用 sapply 大约快 20%。

    sapply(seq(my_list.u), function(x) 
      write.table(my_list.u[[x]], paste0(names(my_list.u)[x], ".txt"),
                  row.names=FALSE, quote=FALSE, sep="\t", dec=","))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多