如何根据名称列表对数据框的行进行子集化?

时间:2021-05-27 16:06:16

标签: r

我有一个包含 2 列和约 60000 行的基因表达计数数据集。每列是一个样本,每行是一个由 ensembl ID 表示的基因。我需要通过数据减少或子集以仅包括蛋白质编码的基因。这是我想要实现的小规模示例:

这是我的名为 BDC 的数据集,其中包含各种类型基因的集合 ID 以及每个样本的计数数据:

ENSEMBL           Sample A    Sample B
ENSG00000198888      10          2
ENSG00000210082      3           13
ENSG00000198763      6           18
ENSG00000198886      12          11

我还有一个名为 ProtCod 的 ensembl ID 列表,其中包含我知道是蛋白质编码的基因:

ENSEMBL_Protein_Coding
ENSG00000198888
ENSG00000198763

所以我想对我的数据集进行子集化,以仅包含具有蛋白质编码集合 ID 的行并排除所有其他行:

ENSEMBL           Sample A    Sample B
ENSG00000198888      10          2
ENSG00000198763      6           18

但我需要大规模地实现这一目标,将我的数据集从约 60000 行或基因减少到约 20000 行。

这是我迄今为止尝试过的:

BDCProtCod <- BDC[!row.names(BDC) %in% ProtCod, ]
BDCProtCod
dim(BDCProtCod)
[1] 60675 2

维度与我原来的 BDC 数据集相同,为什么这段代码不排除不包含来自 ProtCod 的名称的行?

我也试过:

BDCProtCod <- BDC[unlist(ProtCod), ]
BDCProtCod
dim(BDCProtCod)
[1] 19603 2

这实际上排除了我想要排除的行,但它将所有内容都设置为“NA”。

1 个答案:

答案 0 :(得分:1)

你已经删除了你之前的帖子,因为我正在写答案。

似乎 ID 在 ENSEMBL 中存储为 BDC,在 ENSEMBL_Protein_Coding 中存储为 ProtCod,因此要将它们作为向量存储,您应该将它们称为 {{1} } 和 BDC$ENSEMBL 分别

ProtCod$ENSEMBL_Protein_Coding

数据:

BDC[BDC$ENSEMBL %in% ProtCod$ENSEMBL_Protein_Coding, ]

  ENSEMBL         SampleA SampleB
  <chr>             <dbl>   <dbl>
1 ENSG00000198888      10       2
2 ENSG00000198763       6      18