构造具有多个条件的循环

时间:2018-10-08 15:19:36

标签: r

说我有一套

u.count()

我想制作一个包含两个条件的if语句的for循环。如果M = c(-1.64, 1.99, 0.79, 1.72, 1.07, 2.12, 1.98, 0.12) 中存在数字m_1, m_2, m_3

M-1/2 <= m_1 < m_2 < m_3 <= 10

然后,我要执行语句m_3-m_1 <= 1/2,否则我要k = 1。我的第一次尝试/本能是:

k = 0

但是现在我意识到,如果例如for (i in 1:7){ if (-0.5 <= M[i] && M[i] < M[i+1] && M[i+1] < M[i+2] && M[i+2] <= 10 && (M[i+2]-M[i]) <= 1/2) { k = 1 } else k = 0 } ,那么就计算出i=6,这是不存在的……有什么办法吗?

我还认为这样的for循环还不够,但是我需要3个嵌套的具有不同索引的for循环,但这听起来像是一团糟。

1 个答案:

答案 0 :(得分:1)

M唯一重要的项目是-0.5和10之间的阈值。因此,我们将除去所有其他内容,并对剩下的内容进行排序。然后,我们需要将元素偏移2之差,并查看其中的任何一个是否小于您的0.5个差异阈值:

M = c(-1.64, 1.99, 0.79, 1.72, 1.07, 2.12, 1.98, 0.12)
sub_m = sort(M[M >= -.5 & M <= 10])
any(tail(sub_m,-2) - head(sub_m,-2) <= 0.5)
# [1] TRUE

我们可以将其包装在一个方便的函数中:

foo = function(M) {
  sub_m = sort(M[M >= -.5 & M <= 10])
  any(tail(sub_m, -2) - head(sub_m, -2) <= 0.5)
}

foo(1:10)
# [1] FALSE
foo(M)
# [1] TRUE

我建议在其他一些情况下对其进行测试。我已经编写了返回logical是或否的函数,如果希望得到数字结果,可以在其上使用as.integer。您还可以对函数进行参数设置,以选择输入不同的阈值。

tail(sub_m, -2)sub_m的前两个元素外,其余全部。 head(sub_m, -2)只是最后两个元素。因此,tail(sub_m,-2) - head(sub_m,-2)是计算c(sub_m[3] - sub_m[1], sub_m[4] - sub_m[2], ...)的矢量化方法。