Построить цикл с несколькими условиями - PullRequest
0 голосов
/ 08 октября 2018

Скажем, у меня есть набор

M = c(-1.64, 1.99, 0.79, 1.72, 1.07, 2.12, 1.98, 0.12)

Я хочу создать цикл for, содержащий оператор if в зависимости от двух условий.Если существуют числа 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, то вычисляется M[8], которого не существует ... Есть ли способ обойти это?

Я также думаю, что этого недостаточно с одним циклом for, подобным этому, но мне нужно 3 вложенных для циклов с разными индексами, но это звучит как беспорядок.

1 Ответ

0 голосов
/ 08 октября 2018

Единственные элементы 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 true или false, вы можете использовать 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], ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...