我有一个非常大的数据框data
(大于200,000行),包含不同基因的基因组位置。我想根据不同的基因提取所有行,并将它们组合成一个新的数据帧。例如,我想要SSR1
和STK38
的所有行。
chrom txStart ExonCount geneSymbol
chr6 7281287 8 SSR1
chr6 7295624 8 SSR1
chr6 7298155 8 SSR1
chr6 31938951 8 STK19
chr6 31939645 8 STK19
chr6 31940397 8 STK19
chr6 36461668 14 STK38
chr6 36464487 14 STK38
chr6 36465556 14 STK38
chr6 125229391 7 STL
chr6 125241333 7 STL
chr6 125252841 7 STL
当然,我可以使用下面的which
执行此操作,然后使用rbind
将它们合并,但这太费时间了,因为我会有很多基因
Gene1 <- data[which(data$geneSymbol=="SSR1"), ]
Gene2 <- data[which(data$geneSymbol=="STK38"), ]
我尝试了for
循环,但我没有得到正确的输出。
genes1 <- 0
genes <- c("SSR1", "STK38")
for (i in genes) {
genes1 <- print(data[which(data$geneSymbol==i), ])
}
我希望它看起来像这样:
chrom txStart ExonCount geneSymbol
chr6 7281287 8 SSR1
chr6 7295624 8 SSR1
chr6 7298155 8 SSR1
chr6 36461668 14 STK38
chr6 36464487 14 STK38
chr6 36465556 14 STK38
我确信解决方案非常简单,但过去几天我一直在寻找网络,却没有找到解决方案。
答案 0 :(得分:0)
对于多个元素
,我们可以使用%in%
代替==
subset(data, geneSymbol %in% c("SSR1", "STK38"))
# chrom txStart ExonCount geneSymbol
#1 chr6 7281287 8 SSR1
#2 chr6 7295624 8 SSR1
#3 chr6 7298155 8 SSR1
#7 chr6 36461668 14 STK38
#8 chr6 36464487 14 STK38
#9 chr6 36465556 14 STK38
由于数据集很大,我们还可以使用data.table
方法进行子集化。转换&#39; data.frame&#39;到&#39; data.table&#39;,设置&#39;键&#39;列和子集的行是&#39; geneSymbol&#39;是#SSR1&#34;或&#34; STK38&#34;。
library(data.table)
setDT(data, key = "geneSymbol")[.(c("SSR1", "STK38"))]
# chrom txStart ExonCount geneSymbol
#1: chr6 7281287 8 SSR1
#2: chr6 7295624 8 SSR1
#3: chr6 7298155 8 SSR1
#4: chr6 36461668 14 STK38
#5: chr6 36464487 14 STK38
#6: chr6 36465556 14 STK38