如何在 R 中折叠矩阵,同时获取某些列的最小值和最大值

use*_*015 0 r dataframe

我在 R 中有以下数据框。它代表了一个组成的蛋白质结构,以便于解释。

Uniprots Chain resSeq Serial
P68871  D   23  3446
P68871  D   24  3453
P68871  D   25  3457
P68871  D   26  3461
P68871  D   27  3470
P69011  A   38  3561
P69011  A   39  3568
P69011  A   40  3577
P69011  A   41  3588
P69011  A   42  3599
P69011  A   43  3610
P69011  A   44  3619
P69011  A   45  3625
P69011  A   46  3636
P0116   B   2   4239
P0116   B   4   4242
P0116   B   5   4268
P0116   B   6   4279
P0116   B   7   4285
P0116   B   8   4299
P0116   B   9   5015
P0116   C   15  5055
P0116   C   30  5199
P0116   C   42  5239
Run Code Online (Sandbox Code Playgroud)

我想要的是将其折叠起来,使其看起来像这样:

Uniprot Chain resSeq_start resSeq_end Serial_start Serial_end
P68871   D      23            27          3446       3470
P69011   A      38            46          3561       3636
P0116    B       2             9          4239       5015
P0116    C      15            42          5055       5239
Run Code Online (Sandbox Code Playgroud)

基本上,我想折叠到前 1,2 和 3 列。然后我可以使用第四列来检查它是否有效。我以为我可以用聚合来做到这一点,但这似乎不起作用。我绝对可以用一些混乱的 for 循环来做到这一点(继续附加到向量直到新的 uniprot/链),但这很丑陋。

需要注意的一件事是 Uniprot/Chain 组合并不总是唯一的。具体来说,一个 uniprot 可以有多个链(如我的示例)。

感谢您的帮助!

Gre*_*gor 5

而且当然,dplyr

require(dplyr)
dat %>% group_by(Uniprots, Chain) %>%
    summarize(resSeq_start = min(resSeq),
              resSeq_end   = max(resSeq),
              Serial_start = min(Serial),
              Serial_end   = max(Serial))
Run Code Online (Sandbox Code Playgroud)