免疫细胞组分:immunedeconv包与Xcell批量处理文件

科研菌

    一、immunedeconv包的下载与安装
    immunedeconv包:用于根据组织RNA测序数据估算免疫细胞组分的计算方法。该包的资源不同于一般的R包,并没有储存在CRAN或者bioconductor中。在github中查找immunedeconv,搜索页面出来的第一个就是可供R语言调用的immunedeconv包。点击进入便可以找到immunedeconv包的相关内容,以及下载、使用等相关信息。
    
    点击进入,页面的最下方就是immunedeconv包下载的源代码,这是调用remote包中的install.github()函数进行下载。
    
    执行命令如下:
    install.packages("remotes")
    remotes::install_github("icbi-lab/immunedeconv"
    网络差!以上代码执行失败,另寻他法。
    尝试1:通过各种查阅资料,使用devtool包中的install.github(),依然报错了,使用remotes::install_github("icbi-lab/immunedeconv")和devtool::install.github("icbi-lab/immunedeconv"),都出现下面的错误:
    
    尝试2:继续百度,找到一个类似的情况,"invalid multibyte string"提示此处存在错误编码字符。在这里附上原文标题,需要的朋友们可以参考一下,简书《[R|报错解决]Error in nchar(object, type = "chars") : invalid multibyte string, element 1》。
    最终,多次努力之下如愿下载、安装、成功加载immunedeconv包(以下展示)。具体的过程就不再展示了,因为下载immunedeconv包需要的依赖包较多,而每个人的计算机已有的内置包不一样,所以每个人可能会遇到的一些问题不一样。总之,报错提示差什么就补什么。 执行命令如下:
    #########安装immunedeconv##########
    library(devtools)
    Sys.setlocale(category = "LC_ALL",locale = "us")  #调整内码格式
    install_github("icbi-lab/immunedeconv")
    library("immunedeconv")
    ls("package:immunedeconv")
    # [1] "dataset_racle"
    # [2] "deconvolute"
    # [3] "deconvolute_cibersort"
    # [4] "deconvolute_epic"
    # [5] "deconvolute_mcp_counter"
    # [6] "deconvolute_quantiseq"
    # [7] "deconvolute_quantiseq.default"
    # [8] "deconvolute_timer"
    # [9] "deconvolute_xcell"
    # [10] "deconvolution_methods"
    # [11] "eset_to_matrix"
    # [12] "get_all_children"
    # [13] "make_bulk_eset"
    # [14] "make_random_bulk"
    # [15] "map_cell_types"
    # [16] "map_result_to_celltypes"
    # [17] "scale_to_million"
    # [18] "set_cibersort_binary"
    # [19] "set_cibersort_mat"
    # [20] "timer_available_cancers"
    # [21] "xCell.data"
    二、 deconvolute_xcell()的文件分析
    deconvolute_xcell( ) 是immunedeconv包中的一种基于基因表达标志,用于评估混合组织中的64种免疫和基质细胞类型组成的计算方法。故首先用它来分析手头的已有bulk array基因表达矩阵。
    第一步:准备表达矩阵(行名已注释为gene symbol,与immunedeconv包中要求的hugo 基因名一致;列名为样品名)并写入R.
    temptable<-read.table(file ="GSE10186_annotated_exprSet.txt" ,header = TRUE,sep = " ",row.names = 1)
    测试读取出内容如下:
    
    第二步:执行deconvolute_xcell()并查看结果
    abc <- deconvolute_xcell(gene_expression_matrix = temptable ,arrays = TRUE)
    knitr::kable(abc[1:5,1:5], digits=2)
    # |           | GSM256425| GSM256426| GSM256427| GSM256428| GSM256429|
    # |:----------|---------:|---------:|---------:|---------:|---------:|
    # |aDC        |      0.00|      0.03|      0.03|      0.04|      0.04|
    # |Adipocytes |      0.07|      0.09|      0.09|      0.08|      0.10|
    # |Astrocytes |      0.00|      0.00|      0.00|      0.00|      0.00|
    # |B-cells    |      0.02|      0.00|      0.00|      0.07|      0.00|
    # |Basophils  |      0.00|      0.13|      0.05|      0.06|      0.14|
    第三步:将结果保存为.csv文件。
    write.csv(file = "GSE10186_Xcell.csv")
    三、for循环进行文件批量处理#
    1.将所有要分析的同类型文件放在同一个文件夹下,将其设置为当前工作路径
    #1.1获取该文件夹下的文件名和文件个数(我这里共有6个文件)
    files<-dir()
    files
    # [1] "GSE10186_annotated_exprSet.txt"         "GSE116174_annotated_exprSet.txt"
    # [3] "GSE14520_GPL3921_annotated_exprSet.txt" "GSE14520_GPL571_annotated_exprSet.txt"
    # [5] "GSE364_annotated_exprSet.txt"           "GSE54236_annotated_exprSet.txt"
    n <- length(files)  #6L
    #2. for循环语句
    #2.1 简单试一试for循环是否可以正确执行。这里用的是批量提取文件的名称,并进行重命名
    for ( i in 1:n){
      print(paste(strsplit(files[i],"_")[[1]][1],"_",i,"_Xcell.csv"))
    }
    #2.2 正式进入循环:读入文件-执行deconvolute_xcell()-写出.csv文件,共循环6次。
    for ( i in 1:n){
      temptable<-read.table(file = files[i],header = TRUE,
                          sep = " ",
                           row.names = 1,
                          quote = "")
      deconvolute_xcell(gene_expression_matrix = temptable ,
                        arrays = TRUE) %>%
        write.csv(file = paste(strsplit(files[i],"[_]")[[1]][1],"_",i,"_Xcell.csv"))
    }
    最终的结果:
    
    四、批量处理过程中遇到的问题及解决方法
    尽管自己认为for循环已经写得很完美了,但刚开始其实并没有想象中的那么顺利,囧…… 文件内容不变,还是刚开始的文件。但是系统一直报错:大意是结果只返回了第一条。在读文件的时候遇到了问题。具体什么原因,我就不得而知了,只有一步一步来尝试。
    解决思路:
    为什么结果只返回第一条?试一试循环,看是不是循环出问题了。可以看出,循环没有问题,因为可以输入6个结果;故可排除循环出问题的可能性。问题就出在读入文件-执行deconvolute_xcell()-写入.csv文件中。
    
    既然不能循环,那就只有拆分开来处理。如下:依次处理,依次看每一步的执行情况。 第一个顺利。
    
    oh......第二个好像出问题了?原来for循环的问题出现在这里。
    
    打开原文件查看,肉眼并不能发现数据格式问题。既然它继续提示字符带有引号(尽管在数据处理之前我已经统一去除了引号,这里为什么会这样提示,我也不知道原因),那就去掉引号吧。 read.table()中quote=""参数可以用于指定包围字符型数据的字符。
    
    增加该参数后,再次执行第二个文件的数据处理,结果就很顺利。在后面的4个文件中,也使用该参数,鉴定完毕,其他几个文件没有问题。
    最后再次尝试for循环:在for循环中添加该参数,再次执行for循环。结果不出意料,非常顺利。就是我上面展示的“2.2 正式进入循环:读入文件-执行deconvolute_xcell()-写出.csv文件,共循环6次”后的结果了。
    结论:在执行for循环的时候,例如从第1个文件到第20个文件,如果在第5个文件处出错,那么系统就可以执行到第4个文件,然后提示返回第1个文件,故我们需要解决第5个文件的问题。唯有解决第5个文件的问题,或者跳过第5个文件,才可以继续执行第6个文件到第20个文件的命令。