【问题标题】:naming element by looping names of list通过循环列表名称命名元素
【发布时间】:2019-12-10 15:46:55
【问题描述】:

对于可能具有误导性的标题和可能的重复帖子感到抱歉

我想创建一个循环,以 1:4 解析列表元素,并将其设置在 data.frame 中,并使用循环选择的元素名称。 我从一个列表开始:

> names(peakAnnoList_chip)
[1] "CAPAN1_px8_JunB"    "CAPAN1_px13_JunB"   "Panc1_13_cjun"      "Panc1_px8_old_cJun"

> class(peakAnnoList_chip)
[1] "list"

然后我得到第一个元素:

> CAPAN1_px8_JunB <- as.data.frame(peakAnnoList_chip[[1]]@anno)
> class(CAPAN1_px8_JunB)
[1] "data.frame"

所以最后我可以做到:

write.table(CAPAN1_px8_JunB, 
            file = "CAPAN1_px8_JunB_annotation.txt",
            sep = "\t", 
            quote = F,
            row.names = F)

但我找不到将特定名称 (CAPAN1_px8_JunB) 设置为 data.frame 的优雅方法

有什么线索吗?

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    一个选项是lapply 循环遍历“peakAnnoList_chip”的名称,提取“anno”并使用write.table将其写入不同的数据集

    lapply(names(peakAnnoList_chip), function(nm) 
            write.table(peakAnnoList_chip[[nm]]@anno, 
        file = paste0(nm, "_annotation.txt"), sep="\t", quote = FALSE))
    

    或者另一个选项是Map

    Map(function(dat, nm) write.table(dat@nno, file =
          paste0(nm, "_annotation.txt"), sep="\t", quote = FALSE),
                  peakAnnoList_chip, names(peakAnnoList_chip))
    

    或者imap

    library(purrr)
    library(stringr)
    imap(peakAnnoList_chip, ~ write.table(.x, file = str_c(.y, 
                "_annotation.txt"), sep="\t", quote = FALSE))
    

    【讨论】:

    • 谢谢你的回答,我会测试一下。还有一种优雅的方法可以在循环中命名: CAPAN1_px8_JunB
    • @sunta3iouxos 我会说不要在全局环境中创建多个对象,因为它效率低下并会产生问题
    • 我绝对理解这一点(最好将所有特殊数据迭代到相同的元素中),但在某些情况下,我希望所有元素供将来参考,因为原始文件可能不再存在,或者甚至分享这些元素。
    • @sunta3iouxos 在这种情况下,您可以删除write.csv 部分并将其存储在list 中,然后再写入。即lst1 &lt;- lapply(names(peakAnnoList_chip), function(nm) peakAnnoList_chip[[nm]]@anno); names(lst1) &lt;- names(peakAnnoList_chip); list2env(lst1, .GlobalEnv) 在全局环境中创建对象
    • 抱歉,还没测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多