【R语言】For 循环在科研中应用的小例子

写在前面
如果能掌握批量分析的技能,相信会对你的科研生活产生重大的影响。个数越大,循环越有用。当然了,如果手里只有十几二十个样本,且对循环不太熟悉的话,逐一操作的时间也许小于写循环的时间。
用好批量处理,横扫多数据样本。本次分享来自GZ07系列课程。

1.For循环和if判断的模式

For循环

for (variable in vector) {
  action(variable)
}

if判断

if (condition) {
  action
} else {
  action
}

总的来说,要分清小括号和大括号。

1.1 利用循环判断癌和癌旁组织

可以查看这个链接对TCGA的数据有个浅显的认识。https://mp.weixin.qq.com/s/Ph1O6V5RkxkyrKpVmB5ODA

### 加载数据
rm(list=ls())
load(file = "data/TCGA_ggplot.Rdata")
 
### 1.首先确定框架,我们想重复的操作是什么?
### 2.单次操作应该如何做
### 3.如何用R语言实现单次的需求
#单次操作的实现
substring(metadata[1,1],14,15)

这里补充一下substring的用法。

  • Description
    Extract or replace substrings in a character vector.

  • Usage
    substr(x, start, stop)
    substring(text, first, last = 1000000L)
    substr(x, start, stop) <- value
    substring(text, first, last = 1000000L) <- value

  • Arguments

x, text      a character vector.

start, first   integer. The first element to be replaced.

stop, last   integer. The last element to be replaced.

value      a character vector, recycled if necessary.
批量操作的具体实现过程:

### 1.创建容器
metadata <- data.frame(TCGA_id=rownames(exprSet)) 
### 2.循环输出内容到容器
for (i in 1:nrow(metadata)) {
  ## 指示,打印变量的目的是方便查看数据报错的位置
  print(i)
  ## substring的用法,这是元素获取,如果不转换成numeric的话,substring提取出来的是character。
  num = as.numeric(substring(metadata[i,1],14,15))
  #如果是肿瘤,就给第2列加上Tumor
  if (num %in% seq(1,9)) {
    metadata[i,2] = "Tumor"
  } 
  #如果是正常组织,就给第2列加上Normal
  if (num %in% seq(10,29)) {
    metadata[i,2] = "Normal"
  } 
}
## 修改名称
colnames(metadata) <- c("TCGA_id","sample")

1.2 单基因的批量相关性分析

这个技能对于未知功能的基因特别有用,可以通过相关性分析将未知功能的基因和已知功能的基因发生联系,从而确定未知基因的功能。

### 加载数据
load(file = "data/TCGA_BRCA_exprSet_plot.Rdata")
test <- exprSet[1:10,1:10]

### 1.首先确定框架,我们想重复的操作是什么?
### 2.单次操作应该如何做
### 3.如何用R语言实现单次的需求
geneA = as.numeric(exprSet[,"FOXA1"]) #按列名提取数据
geneB = as.numeric(exprSet[,"ESR1"])
cor.test(geneA,geneB,method="spearman")
### 眼睛看到还不行,需要能够提取
dd = cor.test(geneA,geneB,method="spearman")
### 1.相关性系数
dd$estimate
### 2.p值
dd$p.value

批量循环的最终实现过程

##1.设定容器,最终生成的数据放在什么地方?
correlation <- data.frame()

##2.修剪要循环的数据
data <- exprSet[,-c(1,2,3)]
test <- data[1:10,1:10]

##3.获取批量操作的范围,应该是个向量
genelist <- colnames(data)

##4.开始for循环,数据导出到容器
gene <- "FOXA1"
genedata <- as.numeric(data[,gene])
#nrow针对data.fram,length针对character。
for(i in 1:length(genelist)){
  ## 1.指示
  print(i)
  ## 2.计算
  dd = cor.test(genedata,as.numeric(data[,i]),method="spearman")
  ## 3.填充
  correlation[i,1] = gene
  correlation[i,2] = genelist[i]
  correlation[i,3] = dd$estimate
  correlation[i,4] = dd$p.value
}

colnames(correlation) <- c("gene1","gene2","cor","p.value")

友情链接:
1.单基因批量相关性分析的妙用:https://mp.weixin.qq.com/s/TfE2koPhSkFxTWpb7TlGKA
2.单基因批量相关性分析的GSEA
https://mp.weixin.qq.com/s/sZJPW8OWaLNBiXXrs7UYFw

1.3 批量名称转换

## 1.首先确定框架,我们想重复的操作是什么?
### 2.单次操作应该如何做
### 3.如何用R语言实现单次的需求

term = as.character(hallmarks$term[1])
### 1.裂解
term = unlist(strsplit(term, split="_", fixed=T))[-1] #-1代表去掉第一个character
### 2.空格连接
term = paste(term, collapse=" ")
term

容器已经存在,直接批量循环输出

hallmarks$term <- as.character(hallmarks$term)
for(i in 1:nrow(hallmarks)){
  print(i)
  term = hallmarks$term[i]
  ### 1.裂解
  term = unlist(strsplit(term, split="_", fixed=T))[-1]
  ### 2.空格连接
  term = paste(term, collapse=" ")
  ### 3.数据导出
  hallmarks$term[i] = term
}

1.4 统计这些基因在显著富集通路中的次数

这个功能比富集分析更有用,能够知道某个基因可能参与了不同的通路,这有可能是最重要的一些基因。

library(clusterProfiler)
dotplot(symboldata)
barplot(symboldata)

### 转换为数据框
symboldata  <- as.data.frame(symboldata )

### 1.首先确定框架,我们想重复的操作是什么?
### 2.单次操作应该如何做
### 3.如何用R语言实现单次的需求


### 修改其中一个
test = symboldata$geneID[1]
test
### 需要裂解
unlist(strsplit(test,split = "/"))


### 1.创建容器,此处是向量
splitvector <- c()
### 2.循环操作导出到容器
for(i in 1:length(symboldata$geneID)){
  print(i)
  new = unlist(strsplit(symboldata$geneID[i],split = "/"))
  splitvector = c(splitvector,new)
}

### 统计频次
table(splitvector)
### 排序
sortdata = sort(table(splitvector),decreasing = T)
### 成数据框来查看
test <- as.data.frame(sortdata)

参考:
果子学生信

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容