R语言 |一些常用的数据整理的技巧(二)

1. 替换

R 复制代码
data$V5[data$V5=='Retroposon']<-"SVA"  #把某列中某值替换成指定值

2. 分组计数

R 复制代码
#方法一:R中自带的aggregate()函数
group_mean <- aggregate(weight ~ feed, data = df, mean) #这个似乎实现的需求比较简单,只能按照1列进行求和或其他


#方法二:dplyr包中的count()函数
library(dplyr)
selDat<-filter(.data=data,V5=="DNA")
selDat %>% count(V1,V4,V5,name = 'cnt', sort = TRUE) #count()函数只能计数,如果要分组进行其他处理还需要用其他的函数

3. 批量读取目录下的文件

R 复制代码
setwd("/home/xxzhang/workplace/project/multiomics/input/V1C-L4IT-AUPs-MIR_HM/")
#install.packages("ggrepel")
library(vroom) #主要使用的package是vroom
library(stringr)
library(ggrepel)
library(reshape2)
filelist <- list.files("./") #需要制定一个目录
n <-length(filelist) 

resultDat<-as.data.frame(matrix(NA,nrow =0,ncol = 2))

for (i in 1:n) #常跟for循环联用,批量快速读取目录下的文件
{
  test<- vroom(filelist[i],id="./",col_names= T,delim="\t")
  t1<-as.character(test[13,2])
  files<-as.character(test[1,1])
  P_value<-strsplit(t1,"\t")[[1]][2]
  ratio<-strsplit(t1,"\t")[[1]][4]
  tissue<-strsplit(files,"_Enhancers.fisher.txt")[[1]][1] #也常用stringr来提取文件名做行名
  values<-cbind(P_value,ratio)
  rownames(values)<-tissue
  resultDat<-rbind(resultDat,values)
}
resultDat$P_value=(-log10(as.numeric(resultDat$P_value)))
resultDat[resultDat$P_value=="Inf","P_value"]=max(resultDat$P_value[resultDat$P_value!=max(resultDat$P_value)])+10

resultDat$label<-as.character(as.data.frame(str_split(rownames(resultDat),"\\."))[2,])

4. cmd指令嵌入perl代码中,实现批量shell

perl 复制代码
system_call("giggle search -i /home/xxzhang/workplace/project/multiomics/ref/HistomeMarker_index/ -q \"/home/xxzhang/workplace/project/multiomics/Enrichment_cCRE/Enrichment_input-TE_gz/TE-".$ID[0]."-".$sub.".bed.gz\" -s >./giggle_TE_HM/".$ID[0]."-".$sub.".HM.giggle.result");
#在字符串中,用.来连接变量;如果遇到双引号等,为了和字符串本身的双引号区分,要加斜杠\"
sub system_call
{
  my $command=$_[0];
  print "\n\n".$command."\n\n";
  system($command);
}

5. perl中,使用Getopt::Long模块来获取用户的输入参数

perl 复制代码
use Getopt::Long;
GetOptions(
            "c=s" =>\$celltype_files,
            "h|help" =>\$help,
);
open (CELL, "< ".$celltype_files) or die "can not open it!"; #$celltype_files即为从用户那边获取的-s后的参数变量

6. PBS系统的示例提交脚本

参考:https://blog.csdn.net/kunxitoothache/article/details/109897918

shell 复制代码
#PBS -N EP-pair
#PBS -q batch #节点名称,如果占用的内存比较大,需要到gpu或fat节点
#PBS -l walltime=720:00:00 #程序最大运行时间,适用于当自己的任务超过系统常规的任务时,需要自己人为设定;
#PBS -l nodes=1:ppn=16 #规定使用的节点数 也可以指定节点#PBS -l nodes=gpu03:ppn=4
#PBS -o /home/xxzhang/data/Sequencing/scRNA-seq/Zhu_4Region_lateAdulthood/split-fastq/fastq/pbs/tmp/tmp.dlPFC_donor53.out #输出文件地址
#PBS -e /home/xxzhang/data/Sequencing/scRNA-seq/Zhu_4Region_lateAdulthood/split-fastq/fastq/pbs/tmp/tmp.dlPFC_donor53.err #错误文件地址
#PBS -M 2456392738@qq.com #邮件发送的邮箱地址


cd /home/xxzhang/workplace/project/multiomics/E-P-Pair/tmp/result/Part5/
python alignEP.py #注意记得加空格,要不然会出现提交到pbs之后,被终止,什么也没有输出,找不到出错原因#这个坑之前也踩过

假设上述文件的名称为test.pbs。

shell 复制代码
qsub test.pbs #把任务命令提交到服务器上
qalter -m ae test.pbs #修改test.pbs任务的邮件发送的属性
qdel test.pbs #删除任务 

7. 使用bioPython的一些模块进行操作

python 复制代码
from Bio import pairwise2
from Bio.Seq import Seq 
from Bio.pairwise2 import format_alignment #双序列比对
seq1 = Seq("AGCCTGAGCAACATAGTGAGACCTTGTCTCTACAAAAAATTCAAAACTTAGCCAAGTGTAGTGGTAGGTGCCTTTAGGTGCAGCCACTCAGGAGGCTGAGGTAGGAGGGCTGCTTGAGCCCAGGAGTATGAGGCTGTAGTGAGCTATGATGGTGCCATTGCACTCCAACCTGGACAACAGAGCAAGATCCTGTCTTAAAAAAAGAAAAGAAAA")
seq2 = Seq("GGCCGGGCACAGTGGCTCATGCCTGTAATCCCAGCACTTTGGGAGGCTGAGACGGCAGATCACTGGAGGTCAGGAGTTTGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCTGGATGTGGTGATGCTTGCCTGTAATCCTAGCTACTTGGGAGGCTGAGGCAGGGGAATGACTTGAACCTGGGAGGTGGAGATTTTACTCAGCCGAGATGGTGCCATTACACTCCAGCCTGGGTGACAGAGTGAGACTCTGTCTCAAAAA")
alignments = pairwise2.align.localxx(seq1, seq2) #局部比对
for alignment in alignments: 
	print(format_alignment(*alignment))

8. 提取list的每个第1位

R 复制代码
data$TF<-sapply(TF,"[[",1) #提取list TF的每个第1位

9. 将数据指定的索引(chr1-chrX)顺序排列----用bedtools

shell 复制代码
bedtools sort -i A.bed -faidx ../names.txt >B.sorted.bed #names.txt即为指定的顺序 
#之所以这个专门写一节,是因为之前在对bed文件进行排序的时候,走过很多的弯路。用shell自己的sort函数,需要费很大的劲儿才能达到自己想要的结果;

10. bedtools的slop和flank函数的区别

10.1 slop函数--左右延伸Xbp(包含)
shell 复制代码
#slop函数和flank函数,在我之前想取gene的promoter和downstream的位置的时候,经常会被混用
#slop函数,是包含已有的bed区域,左右延伸指定的位置
#flank函数,是不包含已有的bed区域,左右延伸指定的位置

cat A.bed #bed文件
chr1 100 200 a1 1 +
chr1 100 200 a2 2 -

cat my.genome #基因组的染色体大小
chr1 1000

bedtools slop  -i A.bed -g my.genome -l 50 -r 80 -s #此处要特别注意,如果按照链进行取的话,链应该在第6列
chr1 50  280 a1 1 +
chr1 20  250 a2 2 -
#这里曾经踩过很严重的坑,因为忽略到strand应该在第6列,所以对负链的处理无效,全部被bedtools当做了正链来处理,因此影响到了下游的一系列的操作;
10.2 flank函数--左右延伸Xbp(不包含)
shell 复制代码
cat A.bed #bed文件
chr1 100 200
chr1 500 600

cat my.genome #基因组的染色体大小
chr1 1000

bedtools flank -i A.bed -g my.genome -b 5 #both两段各延伸5bp
chr1  95      100
chr1  200     205
chr1  495     500
chr1  600     605

bedtools flank -i A.bed -g my.genome -l 2 -r 3 #left 2bp,right 3bp
chr1  98      100
chr1  200     203
chr1  498     500
chr1  600     603

11. 批量根据某一列的信息拆分大的文件

perl 复制代码
#!perl
use Getopt::Long;
GetOptions(
            "i=s" =>\$file1,
            "f=s" =>\$file2,
            "e=s" =>\$index,
            "o=s" =>\$type,
            "p=s" =>\$col,
            "h|help" =>\$help,
);
 
print $file1;
print $type;
print $col;

if($help)
{
print
"
usage:
-i         : Hs_repeat_superfamily.txt
-f         : repeat_interest_uniq.sort.bed
-e         : ../split_sort_b
-o         : superfamily
-p         : 5
-h         : usage of this perl file
"
}
##获取用户的输入文件和参数

open (MARK, "< ".$file1) or die "can not open it!"; #读取文档,每一行是我们要根据其提取的特征
while ($line = <MARK>){
		print($line);
		chomp($line);
		print($line);
		system_call("mkdir  ./".$type."/".$line); #新建文件夹
		system_call("awk \'\$".$col."==\"".$line."\"\' ".$file2." |sed 's\/\\s\\+\/\\t\/g' >./".$type."/".$line."/".$line.".bed"); #提取文件中,某列为XX的行
}
close(MARK);
sub system_call
{
  my $command=$_[0];
  print "\n\n".$command."\n\n";
  system($command);
}

12. 使用Homer做motif富集

(1)构建homer的输入文件
shell 复制代码
awk -v FS="," -v OFS="\t" '{if($13~"TRUE") print "peak"NR,$5,$6,$7,$8 }' AU-L1_in_dlPFC_L2-3_IT.csv >Hs_AU-L1.bed
awk -v FS="," -v OFS="\t" '{if($13~"FALSE"||$13~"TRUE") print "peak"NR,$5,$6,$7,$8 }' AU-L1_in_dlPFC_L2-3_IT.csv >AU-L1.bed

主要要注意的是"peak"NR的应用;

(2) 使用homer进行motif富集
shell 复制代码
findMotifsGenome.pl /home/xxzhang/workplace/project/multiomics/input/AUPs/Homer_input/dlPFC-L2-3-IT-AUPs-Homer.bed  hg38  /home/xxzhang/workplace/project/multiomics/output/HomerTF/  -size given

13. 去除全是零的行

R 复制代码
X[which(rowSums(X) > 0),]

14. PCA 分析

filter_data2<-filter_data[!apply(filter_data,1,var)%in%c(0,NA),]
pca <- prcomp(t(filter_data2), center=TRUE, scale=TRUE) #注意这里需要转置

pcaPlotDat <- cbind(filter_phe, pca$x[,1:2])
ggplot(pcaPlotDat) + geom_point(aes(x=PC1, y=PC2, shape=Species, color=factor(Predicted.period)), size=3)
相关推荐
BigYe程普4 分钟前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发
彭于晏6895 分钟前
Android广播
android·java·开发语言
弱冠少年31 分钟前
websockets库使用(基于Python)
开发语言·python·numpy
长天一色32 分钟前
C语言日志类库 zlog 使用指南(第五章 配置文件)
c语言·开发语言
一般清意味……44 分钟前
快速上手C语言【上】(非常详细!!!)
c语言·开发语言
卑微求AC44 分钟前
(C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)
linux·c语言·开发语言·嵌入式·c语言贪吃蛇
技术无疆1 小时前
【Python】Streamlit:为数据科学与机器学习打造的简易应用框架
开发语言·人工智能·python·深度学习·神经网络·机器学习·数据挖掘
金灰1 小时前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
爱上语文1 小时前
Java LeetCode每日一题
java·开发语言·leetcode
Манго нектар2 小时前
JavaScript for循环语句
开发语言·前端·javascript