美文网首页ggplot集锦
R使用笔记:批量读取 / 保存图片及$,[],[[]]备忘

R使用笔记:批量读取 / 保存图片及$,[],[[]]备忘

作者: GPZ_Lab | 来源:发表于2018-05-29 17:04 被阅读182次

    本次笔记内容:

    • 导入多个文件并设置与文件名一致的变量名:assign(),strsplit()
    • 单个pdf保存多张plot / 多个pdf保存多张plot
    • $, [] , [[]] 备忘

    你想以read.csv()读入多个文件,并以文件名命名产生的各object

    path <-  'home/usr/project/file'
    files <- list.files(path = paht, pattern = "*report.csv")   # 读取path文件夹中所有以report.csv结尾的文件
    files
    [1] "c_level_report.csv" "f_level_report.csv" "g_level_report.csv" "k_level_report.csv" "o_level_report.csv"
    [6] "p_level_report.csv" "s_level_report.csv"
    
    for (file in files) {
       filename = strsplit(file, "[.]")[[1]][1]  # 以.为分隔符,将'f_level_report.csv'这样的字符串拆分并取前一个。如果不在.外面加上[], R似乎会把.当作正则表达式从而出问题。
       assign(filename,
              read.csv(paste(path, file, sep = ""), header = TRUE, check.names = FALSE, row.names = 1))
       # 使用assign()将filename和读入的文件对应起来
    }
    
    ls()  # 查看一下相应的object
    
    

    pdf() plot(...) dev.off()用于保存图片,你根据上述不同物种的文件画了很多很多图,做了一个巨大List,其结构如下,一共3个levels, 1个level有4张图。

    plots

    现在你要给每个level建立一个pdf,每个pdf里是对应这个level的4张图,并把pdf命名为“这个Level的PCA”。

    list_tax_ra <- list(genus_level = g_level_report, family_level = f_level_report, phlumn_level = p_level_report)
    
    for (tax_ in names(list_tax_ra)) {
       pdf(paste(tax_, "PCA.pdf", sep = "_"), width = 10, height = 7)  # 可以设置图片的大小
       print(plots[tax_])   # 这里一定要print()出来。或者直接plot()出来,否则pdf是空的
       dev.off()
    }
    

    如果你想在单个pdf里添加多个图,那把pdf()放在for loop外面就好。上述代码是已构建好一个存储好plot的list, 建立多个pdf存储多个图。

    $,[],[[]]备忘
    $, [], [[]]都是R的subsetting operators,应用于各种不同的数据类型,vectorc(), list, dataframe等。在对不同数据类型的对象操作时,其含义是不一样的。

    在第一个代码块中strsplit(file,"[.]")[[1]][1]用到了[[]]和[]。当你对一个list of lists使用[], 得到的总是list. 要得到list中的内容,需要用[[]]。所以在这个代码中[[1]]把split的结果提取出来,其内容为一个vector。[1]则对vector操作,取该vector的第一个元素。

    > strsplit("p_level_report.csv", "[.]")
    [[1]]
    [1] "p_level_report" "csv"          
    
    > strsplit("p_level_report.csv", "[.]")[1]
    [[1]]
    [1] "p_level_report" "csv"          
    
    > strsplit("p_level_report.csv", "[.]")[[1]]
    [1] "p_level_report" "csv"    
          
    > strsplit("p_level_report.csv", "[.]")[[1]][1]
    [1] "p_level_report"
    

    在第二个代码块中,plots本身是个复杂List,plots[tax_]返回的仍然是list:以name作为索引,提取出子list。

    $可以用于对list的操作list$name,或者dataframe提取列dataframe$colname,它和[[]]很相似,但有个很容易犯的错误:
    在函数、循环中,你可能会把要subset的列名存储在一个变量里,subset不出任何东西。这时候需要用mtcar[[var]]

    > var <- "cyl"
    # Doesn't work - mtcars$var translated to mtcars[["var"]]
    > mtcars$var
    NULL
    

    参考链接:
    http://adv-r.had.co.nz/Subsetting.html

    相关文章

      网友评论

        本文标题:R使用笔记:批量读取 / 保存图片及$,[],[[]]备忘

        本文链接:https://www.haomeiwen.com/subject/njyujftx.html