在R中的循环内循环

时间:2013-08-05 15:52:07

标签: r loops for-loop nested-loops

我正在尝试在R中构建一个非常复杂的循环。

我有一组数据集作为名为p_int的对象(p_int是峰值强度)。 对于此示例,p_intstr(p_int)的结构为:

num [1:1599]

p_int的大小可能会有所不同,即[1:688],[1:1200]等。

我正在尝试用p_int构建一个复杂的循环来提取单同位素峰,这些是具有某些特征的峰,它们将被提取到第二个对象中:mono_iso:< / p>

  1. p_int中搜索前八组数据结果。在这8个中,找到得分最高的数据集(该分数也需要高于50)。
  2. 找到此结果后,请将其记录到mono_iso
  3. 然后,循环将固定到此结果位于大型数据集中的位置。然后,从该位置开始,它将沿着数据集跳过下一个结果,然后对下一组8个结果执行相同操作。
  4. 类似于此:

    16 Results: 100 120 90 66 220 90 70 30 70 100 54 85 310 200 33 41
    

    **因此,首先,循环将获得前8个结果:

    100 120 90 66 220 90 70 30
    

    **然后它决定哪个峰值最大:

    220
    

    **它将确定220是否大于50

    IF YES:  It would record 220 into "mono_iso"
    IF NO: It would move on to the next set of 8 results
    

    ** 220大于50 ...所以记录到mono_iso

    然后循环将其位置设置为220,然后跳过“90”并再次开始相同的事情,从下一个数据结果开始的下一组8个结果:在这种情况下,在70:< / p>

    70 30 70 100 54 85 310 200
    

    然后它将记录“310”值(最高值)并再次执行相同的操作等等,直到数据集结束。

    希望这很有道理。如果有人能帮助我使用R-script制作这样的循环,我会非常感激。

1 个答案:

答案 0 :(得分:3)

使用此:

mono_iso <- aggregate(p_int, by=list(group=((seq_along(p_int)-1)%/%8)+1), function(x)ifelse(max(x)>50,max(x),NA))$x

这会为NA的群组设置max(...)<=50。如果你想过滤掉那些,请使用:

mono_iso <- mono_iso[!is.na(mono_iso)]