-
Notifications
You must be signed in to change notification settings - Fork 0
/
README.Rmd
251 lines (173 loc) · 9.21 KB
/
README.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
---
output: github_document
---
<!-- README.md is generated from README.Rmd. Please edit that file -->
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
fig.path = "man/figures/README-",
out.width = "100%"
)
```
# ZhangRtools
<!-- badges: start -->
[![Lifecycle: experimental](https://img.shields.io/badge/lifecycle-experimental-orange.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental)
<!-- badges: end -->
> 工作中常用到的一些基于R的功能,整理到一起了,方便重复使用。
## 1. 安装
You can install the development version of ZhangRtools from [GitHub](https://github.com/) with:
``` r
library(devtools)
install_github("fentouxungui/ZhangRtools")
```
## 2. 功能
```{r}
library(ZhangRtools)
```
### 2.1 文件内容修改
#### ModifyFile
以逐行读取方式,对文件里的内容进行字符串替换。
```{r eval=FALSE}
ModifyFile(file = "./scRNAseq/Fly/Ovary/Fly-Ovary-Jevitt-PlosBiology-2020/Parameters.R", #文件路径
LineMatchKeyWords = c("SplitBy.levels.max","15"), # 关键词向量,用于定位要被修改的行
LineMatch.ignore.case = FALSE, # 依据关键词定位行时,是否需要忽略关键词的大小写
WordOld = "SplitBy.levels.max <- 15", # 要被替换的词,一个字符串
wordold.Matchfixed = TRUE, # 匹配字符串时,是否需要完全匹配,FALSE为使用正则表达式
WordNew = "SplitBy.levels.max <- 50", # 新词,一个字符串
Replace = TRUE, # 是否执行替换,一个逻辑值
SaveOld = TRUE, # 是否要保存旧的文件,一个逻辑值
silence = FALSE, # 是否屏蔽信息输出,一个逻辑值
returnSummary = TRUE) # 是否输出替换统计结果,一个逻辑值,主要用于批量替换
```
#### BatchModifyFile
以批量形式,对某个目录下的某类文件进行字符串替换。
```{r eval=FALSE}
BatchModifyFile(Directory = "./shiny-server/PublicData/scRNAseq", # 目录
FileNamePattern = "^Parameters.R$", #目录下,所有符合此正则表达式的文件
LineMatchKeyWords = c("SplitBy.levels.max","15"), # 用于寻找要被修改的行,一个关键词向量
LineMatch.ignore.case = FALSE, # 依据关键词寻找要被修改的行时,是否需要忽略行关键词的大小写,一个逻辑值
WordOld = "SplitBy.levels.max <- 15", # 要被替换的词,一个字符串
WordNew = "SplitBy.levels.max <- 50", # 新词,一个字符串
Replace = TRUE, # 是否要执行替换,一个逻辑值
SaveOld = TRUE) # 是否保存旧文件,一个逻辑值
```
**建议,执行批量替换之前,先使用参数``Replace = FALSE``看一下替换是否正确!**
### 2.2 数据框相关
#### Aggregate_df
合并某列的重复值,对其他所有行进行字符串拼接[**压缩行**]。压缩时,使用“; ”进行分隔。
```{r}
dt <- data.frame(genotype = c("X1", "X2", "X3", "X1", "X2", "X3", "X1", "X2", "X3"),
variable = c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
value = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L), stringsAsFactors = FALSE)
dt
Aggregate_df(df = dt, id = colnames(dt)[1])
```
#### Expand_df
对某列进行字符串切割,复制其他所有行[扩展行]。
```{r eval=FALSE}
Expand_df(df,
id, # 要被切割的列
splitby = "/") # 字符串切割时的分隔符
```
#### update_IDs
基于数据库,对ID向量进行转换,返回更新后的向量,其中NA值或空字符串会返回NA值。另外,ID向量里的单个元素可以是多个ID的组合。
```{r}
db <- data.frame(old = c("1","2","3"), new = c("A", "B", "C"))
update_IDs(old = c("2","2","1"), # 要被转换的id向量,元素可以是多个id名的组合,用| ;或其它符号隔开。
db = db, # 注释数据库,包含旧名和新名
from = "old", # 注释数据库中对应原来ID的列名
to = "new", # 注释数据库中新ID的列名
split = NULL, # 如果ID向量中的元素为多个id组合,需要指定分割符号,默认为NULL,即为单个ID,无需分割
fixed = TRUE) # 默认TRUE,被strsplit函数继承的参数
update_IDs(old = c("2;2","3","1"),
db = db,
from = "old",
to = "new",
split = ";",
fixed = TRUE)
```
常用对数据框里的某一列基因ID进行更新或转换。
#### mapping_update
基于至多3个关键词的数据框更新
依据数据库信息,和至多3种ID,更新数据。返回1个list,包含两个数据框,第一个matched:更新后的数据框,第二个lost,不能被识别的行。注意:该函数值更新了第一个关键词,即by.input列。另外,该函数在后两轮匹配时,会输出重复匹配的条目。
返回一个list,包含两个数据框,第一个matched:更新后的数据框,第二个lost,不能被识别的行.可能的问题:1. 如果两个ensembl id对应同一个HGNC,那么第二轮
用HGNC匹配时,可能仅能匹配到一个Ensebmbl id。同理第三轮匹配也是。
```{r eval=FALSE}
mapping_update(inputDF = tf.full.database,
db = gtf,
by.input = "Ensembl.ID", by.db = "Ensembl",
by.input.2 = "HGNC.symbol", by.db.2 = "Symbol",
by.input.3 = "EntrezGene.ID", by.db.3 = "EntrezID")
```
```{r}
demo_df1 <- data.frame(A = c("a", "b", "c", "d", "e", "f","g"),
B = c("A", "B", "C", "D", "E", "F", "G"),
C = c(11, 12, 13, 14, 15, 6, 7))
demo_df2 <- data.frame(a = c("a", "b", "c", "dd", "ee", "ff", "h"),
b = c("A", "BB", "C", "D", "E", "FF", "H"),
c = c(21, 22, 23, 24, 25, 6, 77))
mapping_update(inputDF = demo_df1,
db = demo_df2,
by.input = "A", by.db = "a",
by.input.2 = "B", by.db.2 = "b",
by.input.3 = "C", by.db.3 = "c")
```
#### mapping_join
基于至多3对关键词,合并两个数据框
与mapping_update的区别,mapping_join不会修改原来的数据,只是在原来数据的基础上,添加新数据到新的列中。
返回1个list,包含两个数据框,第一个matched:合并后的数据框,第二个lost,不能被识别的行。
注意:该函数的第一个关键词,即by.input列,应为绝大多数能被匹配上的。关键词可以重复使用,每次的关键词对不同即可。另外,该函数在后两轮匹配时,会输出重复匹配的条目。
关键词匹配是有优先顺序的,第一次被匹配上了,后续就不会再去做匹配。
```{r eval=FALSE}
mapping_join(inputDF = tf.full.database,
db = gtf,
by.input = "Ensembl.ID", by.db = "Ensembl",
by.input.2 = "HGNC.symbol", by.db.2 = "Symbol",
by.input.3 = "EntrezGene.ID", by.db.3 = "EntrezID")
```
```{r}
mapping_join(inputDF = demo_df1,
db = demo_df2,
by.input = "A", by.db = "a",
by.input.2 = "B", by.db.2 = "b",
by.input.3 = "C", by.db.3 = "c")
```
### 2.3 HGNC 数据库相关的
#### Check_hgnc_hits
修正HGNC的Multi-symbol checker工具的输出结果
HGNC 提供的[Multi-symbol checker在线工具](https://www.genenames.org/tools/multi-symbol-checker/)可以将基因名更新到最新,但是会输出所有匹配的结果,也就是说单个input gene可能会有多个hits.此工具可保留主要匹配结果,去除可能的错误hits以及未必对上的input.
```{r eval=FALSE}
Check_hgnc_hits(hgnc.hits)
```
### 2.4 scRNAseq 相关的
#### top_genes
对Seurat Object里的各个单细胞,分别统计top表达的基因,即基因的reads比例大于所设定的阈值expt.cut,并将结果汇总到一起。返回Top表达的基因,包括细胞数目、平均值和中位值信息。
```{r eval=FALSE}
top_genes(SeuratObj,
expr.cut = 0.01) # 针对UMI counts比例所设定的cut off,用于定义高表达的基因。
```
### 2.5 简单绘图
#### David 富集结果绘图 - **柱状图**
```{r fig.width=10,fig.height=4}
requireNamespace("dplyr")
requireNamespace("ggplot2")
df <- read.delim(system.file("extdata", "David_outputs_GO.txt", package = "ZhangRtools"), stringsAsFactors = FALSE)
David_barplot(df, fill.color = c("#ff9999","#ff0000"),x = "Fold.Enrichment", xlabel = "Fold Enrichment")
David_barplot(df, x = "Fold.Enrichment", xlabel = "Fold Enrichment", arrange.by.x = TRUE)
df %>% dplyr::mutate(fdr = -log(FDR, base=10)) %>% David_barplot(x = "fdr", xlabel = "-log(10)FDR")
kegg.res <- read.delim(system.file("extdata", "David_outputs_KEGG.txt",package = "ZhangRtools"), stringsAsFactors = FALSE)
David_barplot(df = kegg.res, fill.color = c("#ff9999","#ff0000"),x = "Fold.Enrichment", xlabel = "Fold Enrichment")
```
#### David富集结果绘图 - **气泡图**
```{r fig.height=4,fig.width=6}
requireNamespace("dplyr")
requireNamespace("ggplot2")
df <- read.delim(system.file("extdata", "David_outputs_KEGG.txt", package = "ZhangRtools"), stringsAsFactors = FALSE)
David_dotplot(df)
David_dotplot(df, arrange.by.x = TRUE)
```
## Session Info
```{r}
sessionInfo()
```