R:在没有循环的情况下为单个值填充多个匹配的数据框

时间:2017-09-18 14:49:43

标签: r dataframe

我使用while循环解决了这个问题。我已经意识到在R中使用循环通常是不好的做法,因此想知道其他方法。

我有两个数据框,一个是基因名称的单列df:

head(genes)

   Genes
 1  C1QA
 2  C1QB
 3  C1QC
 4 CSF1R
 5  CTSC
 6  CTSS

对于给定基因的每个转录本,具有基因名称(HGNC.symbol)和伴随的ensembl ID(Gene.stable.ID)对的双列df:

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中的每个基因创建一个df,从ensembl_key df中提取所有相应的转录本ID(Gene.stable.ID)。

我之所以找到循环解决方案,是因为genes中的单个条目可能在ensembl_key中有多个匹配项。我需要保留所有匹配并将它们包含在最终的df中,我也不知道来自genes的单个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 个答案:

答案 0 :(得分:1)

听起来你想加入或合并。有几种方法可以做到这一点,但以下情况应该有效。

link_copy