web-dev-qa-db-ja.com

別のデータフレーム/リストに基づいてデータフレームの列をサブセット化する

次の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|

510個の遺伝子IDのリストであるaccessions40と呼ばれる別のデータフレームがあります。これはtable1の最初の列のサブセットです。つまり、その値(510)はすべてtable1(8083)の最初の列に含まれています。 accessions40の頭が下に表示されます:

|V1             |
|:--------------|
|LdBPK_330360.1 |
|LdBPK_283000.1 |
|LdBPK_360210.1 |
|LdBPK_261550.1 |
|LdBPK_367320.1 |
|LdBPK_361420.1 |

私がしたいことは次のとおりです:最初の列(遺伝子ID)の下にtable2にある値と他の5つの列からの対応する値のみを含む新しいaccessions40を生成したいtable1。つまり、table1の値に基づいて、accessions40の最初の列をサブセット化します。

14
BCArg

%in%を使用して論理ベクトルを取得し、それに基づいて 'table1'の行をsubsetできます。

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

より良いオプションはdata.tableです

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

または、filterからdplyrを使用します

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

これを行うには多くの方法があります。 gene_IDtable1列にあるV1accession40を見つける

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

または、matchを使用することもできます

table1[match(accessions40$V1, table1$gene_ID), ]
6
Ronak Shah