zl程序教程

您现在的位置是:首页 >  后端

当前栏目

lapply与自定义函数 apply sapply 字符串变成list list变成vector 向量 调用开方括号函数“[”和参数1来获取每个基因的第一个 id r匹配双反斜杠 双斜杠匹配正则。

List 函数 获取 字符串 参数 自定义 调用 ID
2023-09-14 09:16:03 时间

https://zhuanlan.zhihu.com/p/370586866
https://www.jianshu.com/p/59fb24ca2ea7

Adding gene names Our result table only uses Ensembl gene IDs, but
gene names may be more informative. Bioconductor’s biomaRt package can
help with mapping various ID schemes to each other. First, we split up
the rownames of the results object, which contain ENSEMBL gene ids,
separated by the plus sign, +. The following code then takes the fi rst id for each gene by invoking the open square bracket function “[” and the argument, 1. 然后,下面的代码通过调用开方括号函数“[”和参数1来获取每个基因的第一个 id。

提取每行的行名第一个| 竖线之前的字符串

res$ensembl <- sapply( strsplit( rownames(res),split="\\+" ), "[", 1 ) 

The following chunk of code uses the ENSEMBL

mart, querying with the ENSEMBL gene id and requesting the Entrez gene
id and HGNC gene symbol.

library( "biomaRt" )
ensembl = useMart( "ensembl", dataset = "hsapiens_gene_ensembl" )
genemap <- getBM( attributes = c("ensembl_gene_id", "entrezgene", "hgnc_symbol"),
filters = "ensembl_gene_id",
values = res$ensembl,
mart = ensembl )
idx <- match( res$ensembl, genemap$ensembl_gene_id )
res$entrez <- genemap$entrezgene[ idx ]
res$hgnc_symbol <- genemap$hgnc_symbol[ idx ]
Now the results have the desired external gene ids:
head(res,4)
## log2 fold change (MAP): treatment DPN vs Control
## Wald test p-value: treatment DPN vs Control
## DataFrame with 4 rows and 9 columns
## baseMean log2FoldChange lfcSE stat pvalue
## <numeric> <numeric> <numeric> <numeric> <numeric>
## ENSG00000000003 616.390 -0.01579 0.0856 -0.1844 0.854
## ENSG00000000005 0.553 -0.00836 0.1703 -0.0491 0.961
## ENSG00000000419 305.400 -0.01647 0.0935 -0.1762 0.860
## ENSG00000000457 184.341 -0.09290 0.1180 -0.7874 0.431
## padj ensembl entrez hgnc_symbol
## <numeric> <character> <integer> <character>
## ENSG00000000003 0.971 ENSG00000000003 7105 TSPAN6
## ENSG00000000005 NA ENSG00000000005 64102 TNMD
## ENSG00000000419 0.973 ENSG00000000419 8813 DPM1
## ENSG00000000457 0.879 ENSG00000000457 57147 SCYL3

在使用apply函数应用自己写的函数提高运算速度的时候,我遇到了问题(其实还是自己apply函数运用的不够熟练)。

使用apply处理一个数据框,我想对每一行进行处理,每一行上使用自己编写的函数进行计算。自己编写的函数如下:

reprocess <- function(x,vars_event,str1){
  str3 <- paste("(", vars_event, "=='",
                sapply(x[vars_event], as.character), "')",
                sep = "", collapse = " & ")
  set.seed(1)
  xxx <- eval(parse(text=paste("cpquery(fit,event =(",str3,"), evidence = (",str1,"),n=1000000)")))
  return(xxx)
}

具体的代码不需要看,它的意思就是我输入一个向量或数组x,还有后面两个参数vars_event和str1,最后会得出一个数值结果。

可以看到,我的reprocess函数,有个参数x,代表我想处理的数据框的每一行,最开始的时候遇到的麻烦就是下面的代码的样子,我不知道x该如何指定了,因为具体到了数据框里的某一行我根本不知道名称,后来参考了一些资料发现,其实这个x可以不需要写的,也就是说,不用在函数中写出来这个参数。

#错误的示范
aabb <- apply(data_event_1,MARGIN = 1,reprocess(x,vars_event,str1))
不写x的话,根据帮助文档,整个函数只写名称就可以,参数逐个放在函数名称的后面,正确的写法如下:

aabb <- apply(data_event_1,MARGIN = 1,reprocess,vars_event,str1)

实战:

#自建函数,只要输入一个长的类似于"ENST00000641515.1|OR4F5-202|OR4F5|2618|protein_coding|"的字符串,
#就可以返回第一个 | 之前的名字
return_desired_position_value<-function(x,myposition){
  strsplit(x,split = "|",fixed = T)[[1]][myposition]
}
return_desired_position_value("ENST00000641515.1|OR4F5-202|OR4F5|2618|protein_coding|",4)

在这里插入图片描述

dat$name=unlist( lapply(rownames(expr.df),return_desired_position_value,1))
dat$genesymbol=unlist(lapply(rownames(expr.df),return_desired_position_value,6)) 

在这里插入图片描述
https://blog.csdn.net/nixiang_888/article/details/124058558

https://bbs.pinggu.org/thread-3085029-1-1.html 双反斜杠

试了一下,匹配两个反斜杠是没问题的,如下
> str_detect(tmp,"\\\\")   
library(stringr)
str_split("NM_001141945 // ACTA2 /// NM_001613 // ACTA2 /// ENST00000458208 // ACTA2 /// ENST00000224784 // ACTA2 /// AY692464 // ACTA2 /// BC093052 // ACTA2 /// BC017554 // ACTA2 /// CR536518 // ACTA2 /// J05192 // ACTA2 /// AK300664 // ACTA2 /// ENST00000415557 // ACTA2 /// ENST00000458159 // ACTA2 /// uc001kfp.1 // ACTA2 /// uc001kfq.1 // ACTA2",
          pattern = "//")
str_split( "",pattern = "//")
sapply(str_split( "",pattern = "//"), "[",2)
sapply(str_split(ids_for10739$gene_assignment,pattern = "//"),"[",2)

在这里插入图片描述

apply()函数

apply()将数据框或矩阵作为输入,并以矢量,列表或数组形式输出。apply()函数主要用于避免重复使用循环结构。它是所有可以在矩阵上使用的最基本的集合。

此函数接受3个参数:

apply(X, MARGIN, FUN)
-x:数组或矩阵
-MARGIN:取一个介于1到2之间的值或范围,以定义该函数的应用位置:
-MARGIN = 1:对行执行操作 -MARGIN = 2:对列执行操作
-MARGIN = c(1,2)`该操作在行和列上执行
-FUN:告诉应用哪个功能。可以应用平均值,中位数,和,最小值,最大值甚至用户定义的函数等内置函数
最简单的示例是对所有列求和。代码apply(m1,2,sum)将sum函数应用于矩阵5x6,并返回数据集中可访问的每一列的总和。

m1 <- matrix(C<-(1:10),nrow=5, ncol=6)
m1
a_m1 <- apply(m1, 2, sum)
a_m1

在这里插入图片描述
链接:https://www.jianshu.com/p/59fb24ca2ea7

lapply()函数

lapply()函数可用于对列表对象执行操作,并返回与原始集合长度相同的列表对象。lappy()返回一个长度与输入列表对象相似的列表,其每个元素都是将FUN应用于列表的相应元素的结果。lapply()将列表,向量或数据框作为输入,并在列表中给出输出。

lapply(X, FUN)
Arguments:
-X: A vector or an object
-FUN: Function applied to each element of x 
lapply()中的l代表列表。lapply()和apply()之间的区别在于输出返回之间。
lapply()的输出是一个列表。lapply()可以用于其他对象,例如数据框和列表。

lapply()函数不需要MARGIN。

一个非常简单的示例是使用tolower函数将矩阵的字符串值更改为小写。我们用著名电影的名称构造一个矩阵。名称为大写形式。

movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")
movies_lower <-lapply(movies, tolower)
str(movies_lower)
输出:

## List of 4
## $:chr"spyderman"
## $:chr"batman"
## $:chr"vertigo"
## $:chr"chinatown"

我们可以使用unlist()将列表转换为向量。

films_lower <- unlist(lapply(movies,tolower))
str(movies_lower)
输出:
##  chr [1:4] "spyderman" "batman" "vertigo" "chinatown"

sapply()函数
sapply()函数将列表,向量或数据帧作为输入,并以向量或矩阵形式输出。它对列表对象的操作很有用,并返回与原始集合长度相同的列表对象。sapply()函数执行的功能与lapply()函数相同,但返回一个向量。

sapply(X, FUN)
Arguments:
-X: A vector or an object
-FUN: Function applied to each element of x

我们可以从汽车数据集中测量汽车的最小速度和停车距离。

dt <- cars
lmn_cars <- lapply(dt, min)
smn_cars <- sapply(dt, min)
lmn_cars
smn_cars
输出:
## $speed
## [1] 4
## $ dist
## [1] 2
## speed  dist 
##     4     2

我们可以在lapply()或sapply()中使用用户内置函数。我们创建一个名为avg的函数来计算向量最小值和最大值的平均值。

avg <- function(x) {  
  ( min(x) + max(x) ) / 2}
fcars <- sapply(dt, avg)
fcars
输出量

## speed  dist
##  14.5  61.0

**sapply()函数在返回的输出中比lapply()更有效,因为sapply()将值直接存储到向量中。**在下一个示例中,我们将看到情况并非总是如此。

下表总结了apply(),sapply()和lapply()之间的区别:

Function	Arguments	          Objective                            	Input	     Output
apply	apply(x, MARGIN, FUN)	Apply a function to the rows or columns or both	Data frame or matrix	vector, list, array
lapply	lapply(X, FUN)	Apply a function to all the elements of the input	List, vector or data frame	list
sapply	sappy(X FUN)	Apply a function to all the elements of the input	List, vector or data frame	vector or matrix

切片矢量
我们可以使用lapply()或sapply()互换来切片数据框。我们创建一个函数below_average(),该函数接受数值的向量,并返回仅包含严格高于平均值的值的向量。我们将两个结果与 identical() 函数进行比较。

below_ave <- function(x) {  
    ave <- mean(x) 
    return(x[x > ave])
}
dt_s <- sapply(dt, below_ave)
dt_l <- lapply(dt, below_ave)
identical(dt_s, dt_l)
输出:


## [1] TRUE

stringr包里专用于处理字符串向量的函数,这些函数有一个共同特点,str开头。

1.1 检测字符串长度:str_length(x)

1.2 字符串拆分:str_split()

1.3 按位置提取字符串:str_sub()

1.4 字符检测:str_detect(x,"h"):重点掌握用法

1.5 字符串替换:str_replace()/str_replace_all()

1.6 字符删除:str_remove()/str_remove_all()