美文网首页seurat
R语言数据处理替换操作(含gsub函数常用示例)——实战单细胞信

R语言数据处理替换操作(含gsub函数常用示例)——实战单细胞信

作者: 黄甫一 | 来源:发表于2022-07-01 18:07 被阅读0次

适用背景

在R语言中,我们需要对字符串、向量和数据框等数据类型进行替换操作,有时候是因为需要更换别名,有时候是因为数据存在错误需要修正,有时候则是因为需要删除某些信息。本文将介绍常用的替换函数gsub的常用用法,但gsub也存在某些局限性,一般只能进行一次指定情况的操作。例如在单细胞数据分析的信息注释过程中,我们常常需要把无监督聚类得到的clusters注释成细胞类型,如果每一个clusters都写一行替换的代码就会显得相当冗余,因此可以封装成一个函数进行类似的处理就会简单一些。因此,本文后半部分将介绍批量替换写成函数的方法**。

gsub函数

R语言中,最常用的替换函数是gsub,其用法也比较容易理解,一般只需传入三个参数,gsub(匹配内容,替换内容,操作对象)

string='strings'
gsub('s','S',string)
[1] "StringS"
  • 删掉某些字符串:
string='strings'
gsub('s','',string)
[1] "tring"
  • 如果只想替换开头的s,则需要使用正则表达式,代码如下:
string='strings'
gsub('^s','S',string)
[1] "Strings"
  • 只替换结尾的s则写成:
gsub('s$','S',string)
  • 如果有多个匹配项,则使用管道符 |
string='strings'
gsub('^s|i','X',string)
[1] "XtrXngs"
  • 把s及s后面的一个字符替换掉:
string='strings'
gsub('s..','X',string)
[1] "Xings"
  • 把i及后面的字符串替换掉:
string='strings'
gsub('i.*','X',string)
[1] "strX"
  • 如果字符串里有特殊的字符,而匹配内容又含有这种特殊字符,例如^,则用方括号[]括起来:
#不用方括号
string='^strings'
gsub('^','X',string)
[1] "X^strings"
#使用方括号
gsub("[.^]",'X',string)
[1] "Xstrings"
#不用方括号
> gsub(".^",'X',string)
[1] "^strings"
  • 模糊匹配数字后替换:
string='0strings1'
gsub('[0-9]','X',string)
[1] "XstringsX"
  • 模糊匹配字母后替换
string='0strings1'
gsub('[a-z]','X',string)
[1] "0XXXXXXX1"

单细胞注释函数

其实单细胞数据注释也可以看成是一种对数据框的替换操作,因此可以提取Seurat对象的meta.data信息运行以下函数。

函数一 anno_cell

参数简介:

  • meta,输入的数据框,例如obj@meta.data
  • anno.list,注释对应信息,例如anno.list=list("OLI"=c(1,13,11,3,23,18), "MIC"=c(6,22))
  • ref.col,原始列的列名,默认是无监督聚类得到的聚类列seurat_clusters
  • anno.col,注释列的列名,默认是Celltype,如果此列不存在则会自动建一列并标记为'unknown',如果存在,则此列之前的信息会保留,但可能会被覆盖
anno_cell <- function(meta,anno.list=NULL,ref.col='seurat_clusters',anno.col='Celltype'){
colist <- unique(colnames(meta))
if (length(grep(anno.col,colist))==0) {
meta[,anno.col] <- 'unknown'
}
nlen <- length(anno.list)
for (i in 1:nlen) {
name <- names(anno.list)[i]
clust <- anno.list[[name]]
c1 <- which(meta[,ref.col] %in% clust)
if (length(c1)!=0) {
meta[,anno.col][c1] = name
}
}
return(meta)
}

使用示例(obj是Seurat对象):

olic <- c(1,13,11,3,23,18)
micc <- c(6,22)
vlmc <- c(37,40)
nfol <- c(38)
opcc <- c(2)
unknownc <- c(39)
inc <- c(31,25,16,29)
exc <- c(14,12,7,32,34,28,27,24,4,0,35,8,10,30,33,21,36,19)
ast <- c(17,20,41,9,5,15,26)
obj@meta.data <- anno_cell(obj@meta.data,anno.list=list("OLI"=olic,
                                      "MIC"=micc,
                                      "ENDO"=vlmc,
                                      "NFOL"=nfol,
                                      "OPC"=opcc,
                                      "IN"=inc,
                                      "EX"=exc,
                                      "AST"=ast)

以上就完成注释了,可以通过Dimplot函数检查注释得是否正确

函数二 map_anno

有时候,注释结果不是根据无监督聚类得到的,而是需要从其它方法,或者亚群聚类得到信息来注释,简单来说就是需要把从数据框df1中信息转移到数据框df2中,但df1和df2的维度不相等,因此需要进行匹配注释。当然,Seurat自带AddMetaData函数,但由于维度问题,可能会报错。
参数简介如下:

  • ref,参考数据框,含有注释信息
  • que,待注释数据框
  • ref.col,默认为Celltype,参考数据框注释信息所在列
  • que.col,默认为Celltype,待注释的列名,如果此列不存在则会自动建一列并标记为'unknown',如果存在,则此列之前的信息会保留,但可能会被覆盖
map_anno <- function(ref,que,ref.col='Celltype',que.col='Celltype'){
colist <- unique(colnames(que))
if (length(grep(que.col,colist))==0) {
que[,que.col] <- 'unknown'
}
nlen <- length(unique(ref[,ref.col]))
for (i in 1:nlen) {
name <- unique(ref[,ref.col])[i]
c1 <- which(ref[,ref.col] %in% name)
cellist <- rownames(ref)[c1]
que[cellist,que.col] <- name
}
return(que)
}

使用示例:

df1 <- read.table('cell_info.xls',sep="\t",header=T,stringsAsFactor=F)
obj@meta.data <- map_anno(ref=df1,que=obj@meta.data)

小结与讨论

替换操作不只有gsub函数这一种方法,我写的2个函数就没有使用到gsub,当然也可以写成gsub的脚本,但已经写好了就懒得写了。

相关文章

网友评论

    本文标题:R语言数据处理替换操作(含gsub函数常用示例)——实战单细胞信

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