说我有一套
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循环,但这听起来像是一团糟。
答案 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], ...)
的矢量化方法。