基于同一列中的多个变量提取行

时间:2016-08-28 11:53:56

标签: r loops for-loop

我有一个非常大的数据框data(大于200,000行),包含不同基因的基因组位置。我想根据不同的基因提取所有行,并将它们组合成一个新的数据帧。例如,我想要SSR1STK38的所有行。

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

我确信解决方案非常简单,但过去几天我一直在寻找网络,却没有找到解决方案。

1 个答案:

答案 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