我有一个vcf,想要选择100个基因,每个基因,选择一个SNP?从技术上讲,如果我们考虑一个基因,它就有许多rsid被映射到它上。在我的分析中,我需要选择100个基因,每个基因只为它选择一个SNP,而忽略其他的,并且有一个最后的vcf文件,只有100个基因唯一地映射到1 rsid。有什么包裹可以这样做吗?
22 16050075 rs587697622 A G 100.0传球
AC=1;AF=0.000199681;AN=5008;NS=2504;DP=8012;EAS_AF=0;AMR_AF=0;AFR_AF=0;EUR_AF=0;SAS_A F=0.001;AA=.|||;VT=SNP;ANN=G|intergenic_region|MODIFIER|CHR_START-LA16c-4G1.3|CHR_START-ENSG00000233866|intergenic_region|CHR_START-ENSG00000233866|||n.16050 075A>G|||||| GT
这就是我想要做的:库(VcfR)
# Import VCF
my.vcf <- read.vcfR('my.vcf.gz')
# Combine CHROM thru FILTER cols + INFO cols
my.vcf.df <- cbind(as.data.frame(getFIX(my.vcf)), INFO2df(my.vcf))
data_new <- my.vcf.df[!duplicated(my.vcf.df[ ,"ANN"]),]
我的数据集是这样的:
如您所见,ANN列有几个ENSG00000233866值。我想根据ANN值(即基因ID )过滤df,所以对于ENSG00000233866,我只想选择一个或几个rsid或rs值,而忽略其他值。对于其他基因,我也想这样做。
发布于 2022-03-03 02:07:17
考虑一下str.split
中ANN
中以管道分隔的列中的基因,这大约是第四个管道。然后用ave
进行基因分组的顺序计数。然后是1的subset
组号。请不要在下面使用新管道|>
in R 4.1.0+:
data_new <- within(
data_new, {
GENE <- gsub(
"CHR_START-", "",
sapply(strsplit(ANN, "|"), "[", 4)
)
GENE_GROUP_SEQ <- ave(1:nrow(data_new), GENE, FUN=seq_along)
}
) |> subset(
GENE %in% unique(GENE)[1:100] & # SUBSET FOR FIRST 100 GENES
GENE_GROUP_SEQ == 1 # SUBSET FOR FIRST OF EACH GENE GROUP
) |> `row.names<-`(NULL) # RESET ROW NAMES
对于小于4.1.0的R版本,释放管道以分离调用:
data_new <- within(
data_new, {
GENE <- gsub(
"CHR_START-", "",
sapply(strsplit(ANN, "|"), "[", 4)
)
GENE_GROUP_SEQ <- ave(1:nrow(data_new), GENE, FUN=seq_along)
}
)
data_sub <- subset(
data_new,
GENE %in% unique(GENE)[1:100] & # SUBSET FOR FIRST 100 GENES
GENE_GROUP_SEQ == 1 # SUBSET FOR FIRST OF EACH GENE GROUP
)
dat_sub <- `row.names<-`(data_sub, NULL) # RESET ROW NAMES
https://stackoverflow.com/questions/71316146
复制相似问题