基于另一个数据框或列表,在数据框中选择列的子集

46

我有以下的table1,它是由6列和8083行组成的数据框。下面我展示了这个table1的头部:

|gene ID        |   prom_65|   prom_66|  amast_69|  amast_70|   p_value|
|:--------------|---------:|---------:|---------:|---------:|---------:|
|LdBPK_321470.1 |   24.7361|   25.2550|   31.2974|   45.4209| 0.2997430|
|LdBPK_251900.1 |  107.3580|  112.9870|   77.4182|   86.3211| 0.0367792|
|LdBPK_331430.1 |   72.0639|   86.1486|   68.5747|   77.8383| 0.2469355|
|LdBPK_100640.1 |   43.8766|   53.4004|   34.0255|   38.4038| 0.1299948|
|LdBPK_330360.1 | 2382.8700| 1871.9300| 2013.4200| 2482.0600| 0.8466225|
|LdBPK_090870.1 |   49.6488|   53.7134|   59.1175|   66.0931| 0.0843242|

我有另一个数据框,名为accessions40,其中包含510个基因ID的列表。它是table1的第一列的子集,即所有值(510个)都包含在table1的第一列(8083个)中。下面显示了accessions40的前几行:

|V1             |
|:--------------|
|LdBPK_330360.1 |
|LdBPK_283000.1 |
|LdBPK_360210.1 |
|LdBPK_261550.1 |
|LdBPK_367320.1 |
|LdBPK_361420.1 |
我想做的是:生成一个新的 `table2`,其中第一列(基因ID)仅包含在 `accessions40` 中存在的值,并从 `table1` 的其他五列中获取相应的值。换句话说,我想根据 `accessions40` 的值对我的 `table1` 进行子集筛选。
3个回答

82

我们可以使用%in%得到一个逻辑向量,并且根据该向量使用subset函数来筛选'table1'的行。

subset(table1, gene_ID %in% accessions40$V1)

更好的选择是data.table

library(data.table)
setDT(table1)[gene_ID %chin% accessions40$V1]

或者使用来自dplyrfilter

library(dplyr)
table1 %>%
      filter(gene_ID %in% accessions40$V1)

1
如何过滤掉gene_ID中不在accession40$V1中的值? - RanonKahn
4
使用否定符号 (!),即 setDT(table)[!gene_ID %chin% accessions40$V1],可实现将不在accessions40$V1中的gene_ID筛选出来。 - akrun
1
我在错误的位置使用了否定符号,导致出现了错误。谢谢! - RanonKahn
虽然有点晚了,很高兴收到你的来信。我遇到了同样的问题,我使用了这个子集代码,但是它生成了一个空的输出文件,只有第一个(原始)文件中列的名称,该文件在本帖中称为“table1”。你能否帮助我解决这个问题? - Mary
1
@Mary请考虑发布一个带有可重现示例的新问题。 - akrun

12

有许多方法可以做到这一点。在accession40V1列中找到在table1中出现的gene_ID

table1[table1$gene_ID %in% accessions40$V1, ]

或者您也可以使用match

table1[match(accessions40$V1, table1$gene_ID), ]

1

semi_join 并不经常使用,但对于这种情况很有效:

dplyr::semi_join(table1, accessions40, by = c('gene_ID' = 'V1'))

第一个数据框根据第二个进行子集划分,只有当存在匹配时。如果未指定by,则默认情况下将按所有交叉列进行过滤。 数据
table1 <- structure(list(gene_ID = c("LdBPK_321470.1", "LdBPK_251900.1", 
                                     "LdBPK_331430.1", "LdBPK_100640.1", "LdBPK_330360.1", "LdBPK_090870.1"
), prom_65 = c(24.7361, 107.358, 72.0639, 43.8766, 2382.87, 49.6488
), prom_66 = c(25.255, 112.987, 86.1486, 53.4004, 1871.93, 53.7134
), amast_69 = c(31.2974, 77.4182, 68.5747, 34.0255, 2013.42, 
                59.1175), amast_70 = c(45.4209, 86.3211, 77.8383, 38.4038, 2482.06, 
                                       66.0931), p_value = c(0.299743, 0.0367792, 0.2469355, 0.1299948, 
                                                             0.8466225, 0.0843242)), class = "data.frame", row.names = c(NA, 
                                                                                                                         -6L))

accessions40 <- structure(list(V1 = c("LdBPK_330360.1", "LdBPK_283000.1", "LdBPK_360210.1", 
                                      "LdBPK_261550.1", "LdBPK_367320.1", "LdBPK_361420.1")), class = "data.frame", row.names = c(NA, 
                                                                                                                                  -6L))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接