如何在一对列上聚合行,同时以特定方式处理其他列?

时间:2015-05-06 09:35:16

标签: r aggregate-functions data-analysis

我一直在玩R中的聚合功能,但我们并没有真正解决我的问题。

问题如下,我的数据看起来像这样(请注意,还有几列,但为了示例,它们无关紧要):

Description Delta   E.Mass  Charge  RT
TFGTFSVEEYVLPK  0.0111  1615.82 2   94.5554
VSGVGNNISFEEK   0.0073  1378.68 2   51.902
DGNGNTWLTAFVTK  0.0088  1522.75 2   96.1395
DGNGNTWLTAFVTK  0.9961  1523.74 2   98.289
DGNGNTWLTAFVTK  0.9979  1523.74 2   99.1948
DGNGNTWLTAFVTK  0.9958  1523.74 2   98.333
DGNGNTWLTAFVTK  0.9987  1523.74 2   99.2278
DGNGNTWLTAFVTK  0.0084  1522.75 2   95.4033
DVDDPMVSQGLR 15.99492@M6 delta:13.700001    1.013   1347.63 2   46.353
GFGLSPTVGLTAFKPF    0.0052  1637.89 2   109.398
GFGLSPTVGLTAFKPF    0.0092  1637.89 2   108.368
GFGLSPTVGLTAFKPF    0.0089  1637.89 2   108.339
ILDSNEPCGGQK    0.0086  1316.61 2   31.9053
LAPDPSLVIYAIFPSGGVVADK  -0.006  2228.2  3   118.385
LAPDPSLVIYAIFPSGGVVADK  -0.0034 2228.21 3   118.413
LAPDPSLVIYAIFPSGGVVADK  -0.0082 2228.2  3   117.739
PSYQEEAVTK  0.005   1150.56 2   32.2676
PSYQEEAVTK  0.005   1150.56 2   32.2676

我想要实现的目标是:

  1. 聚合Description
  2. 选择最小的Delta
  3. RT值平均为RT_mean
  4. 为任意数字N添加列RT_mean - NRT_mean + N
  5. 在输出中保持所有其他列不变/忽略。
  6. 我已经查看了聚合函数,但似乎我不能使用该函数来执行特定于列的voodoo。

    我尝试by(与rbind}和ddply结合使用但没有真正的突破。我确信它可以做我想做的事情,只需要正确地获得这些功能的参数。但由于我的时间表非常紧张,我无法正常进行常规的试错过程。

    我非常感谢任何帮助或指导,特别是在解释答案的一些评论中,以防我需要修改提供的答案以适应数据。

    编辑:根据这里的评论,这是一个简单的例子,输入如下:

    ID    Delta    Emass    Ch    RT
    A    0.0084    1522.75    2    95.4033
    A    0.0088    1522.75    2    96.1395
    A    0.9961    1523.74    2    98.2890
    B    1.0130    1347.63    2    46.3530
    C   -0.0060    2228.20    3   118.3850
    C   -0.0034    2228.21    3   118.4130
    C    0.0082    2228.20    3   117.7390
    D    0.0050    1150.56    2    32.2676
    D    0.0050    1150.56    2    32.2676
    

    期望的输出将是:

    ID    Delta    Emass    Ch    RT_mean    RT1    RT2
    A    0.0084    1522.75    2    96.6106    93.6106    99.6106
    B    1.0130    1347.63    2    46.3530    43.3530    49.3530
    C   -0.0060    2228.20    3   118.1790   115.1790   121.1790
    D    0.0050    1150.56    2    32.2676    29.2676    35.2676
    

1 个答案:

答案 0 :(得分:1)

使用dplyr包尝试这种操作非常容易。 无法理解最小的三角洲部分。否则此代码将执行其他所有操作。一个更容易重现的例子,最后有预期答案,这将有所帮助。

 library(dplyr)
data %>% group_by(Description) %>% summarize(dif = E.Mass - Delta,
RT_mean = mean(RT),RT_x = RT_mean - 2, RT_y RT_mean -3)