【问题标题】:Looping within a loop in R在R中的循环内循环
【发布时间】:2013-08-05 15:52:07
【问题描述】:

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

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

num [1:1599]

p_int 的大小可以变化,例如 [1:688]、[1:1200] 等。

我试图用p_int 做的是构建一个复杂的循环来提取单同位素峰,这些峰具有某些特征,将被提取到第二个对象中:mono_iso

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

类似这样的:

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:

70 30 70 100 54 85 310 200

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

希望这是完全合理的。如果有人可以帮助我使用 R-script 制作这样的循环,我将非常感激。

【问题讨论】:

  • 为什么要跳过 90?如果峰值是 8 个批次中的最后一个观测值,会发生什么?你确定它不应该继续“70 100 54 ...”吗?在我下面的回答中,我假设您想独立处理每个批次。
  • 我的第一个想法是为此使用 while 循环(这意味着它会很慢,可能应该使用 Rcpp 实现)。

标签: r loops for-loop nested-loops


【解决方案1】:

使用这个:

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

这将为max(...)&lt;=50 等组添加NA。如果你想过滤掉那些,使用这个:

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

【讨论】:

  • 谢谢费迪南德,差不多了!
猜你喜欢
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2019-09-25
  • 1970-01-01
相关资源
最近更新 更多