whileループを使用してこの問題を解決する方法があります。私は、Rでループを使用するのが悪い習慣であることを認識していましたので、代替アプローチが不思議でした。R:ループなしで単一の値に対して複数の一致があるデータフレームを挿入する
head(genes)
Genes
1 C1QA
2 C1QB
3 C1QC
4 CSF1R
5 CTSC
6 CTSS
と遺伝子名(HGNC.symbol)および添付のEnsembl IDのペアを持っている2列のDF(ジーン:
は、私は2つのデータフレーム、遺伝子名のフルDF 1つの列を持っています.stable.ID)所定の遺伝子の各転写産物について:
head(ensembl_key)
Gene.stable.ID HGNC.symbol
1 ENSG00000210049 MT-TF
2 ENSG00000211459 MT-RNR1
3 ENSG00000210077 MT-TV
4 ENSG00000210082 MT-RNR2
5 ENSG00000209082 MT-TL1
6 ENSG00000198888 MT-ND1
私の目標はgenes
DFにおける各遺伝子のためにensembl_key
から対応するすべての転写産物IDの(Gene.stable.ID)を抽出DFを作成することですdf。
私がループソリューションを見つけたのは、genes
の単一のエントリがensembl_key
に複数一致する可能性があるからです。私はすべての試合を残して、それらを最終的なdfに入れる必要があります。また、genes
の1つのIDには先験的な一致があります。
# Create large empty df to hold all transcripts
gene_transcript<- data.frame(matrix(NA, nrow= 5000, ncol= 2))
colnames(gene_transcript)<- c("geneID", "ensemblID")
# Populate Ensembl column
curr_gene<- 1
gene_count<- 1
while(gene_count <= dim(genes)[1]){
transcripts<- ensembl_key[which(ensembl_key$HGNC.symbol== genes$Genes[gene_count]),1]
if(length(transcripts)>1){
num<- length(transcripts)-1
gene_transcript$geneID[curr_gene:(curr_gene+num)]<- genes$Genes[curr_gene]
gene_transcript$ensemblID[curr_gene:(curr_gene+num)]<- transcripts
gene_count<- gene_count+1
curr_gene<- curr_gene + num + 1
}
else{
gene_transcript$geneID[curr_gene]<- genes$Genes[curr_gene]
gene_transcript$ensemblID[curr_gene]<- transcripts
gene_count<- gene_count+1
curr_gene<- curr_gene + 1
}
}
# Remove unneccessary columns
last_row<- which(is.na(gene_transcript$geneID)==T)[1]-1
gene_transcript<- gene_transcript[1:last_row,]
がすべてのヘルプは大歓迎され、感謝:
は、ここに私の現在の作業のソリューションです!
完璧に、ありがとう! –