我使用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,]
非常感谢任何帮助,谢谢!
答案 0 :(得分:1)
听起来你想加入或合并。有几种方法可以做到这一点,但以下情况应该有效。
link_copy