2017-09-18 14 views
0

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,] 

がすべてのヘルプは大歓迎され、感謝:

は、ここに私の現在の作業のソリューションです!

答えて

1

参加またはマージしたいと思うようです。これを行うにはいくつかの方法がありますが、以下の方法が有効です。

merge(genes, 
     ensembl_key, 
     by.x = "Genes", 
     by.y = "HGNC.symbol") 
+0

完璧に、ありがとう! –

関連する問題