Как использовать ifelse для вектора с несколькими вычислениями после оператора if (который использует записи из других векторов) - PullRequest
3 голосов
/ 08 мая 2019

У меня есть несколько векторов в функции одинаковой длины (2000). Я хочу проверить с помощью оператора if, выполняется ли какое-либо условие в одном векторе, а затем код должен выполнить несколько вычислений с записями из других векторов той же строки. До сих пор я не мог решить это ни с помощью обычного оператора if, ни с помощью функции ifelse. Это может быть решено с помощью цикла, но, поскольку у меня есть 2000 наблюдений, это приведет к длительному времени выполнения кода - чего я хотел бы избежать. Мой код выглядит так:

function1 = function(vec1,vec3,vec4,vec5){

ifelse(vec5 < 20,
# Calculations follow which should be executed when the statement is true
# The row used for vec1 and vec3 should be the same as the row which got 
# checked for vec5
a <- vec1 * 2 * vec3
b <-  vec1 * 4
c <- cbind(a,b)
d<- apply(c, 1, FUN=min),

# Now should be the calculations if the if-statement is false
# Again, the row used for vec1, vec3 and vec 4 should be the same as the row
# which got checked for vec5
a <- vec1 * 2 * vec3
b <-  vec1 * 4
c <- cbind(a,b)
d1<- apply(c, 1, FUN=min)
a2 <- vec1 * 1.5 * vec4
b2 <-  vec1 * 4
c2 <- cbind(a2,b2)
d2<- apply(c2, 1, FUN=min)
d = d1 + d2) # end of ifelse

return(d)
}

# For convenience lets just assume the vectors are of length 3
vec1 <- c(100,150,120)
vec3 <- c(12,20,28)
vec4 <- c(42,48,43)
vec5 <- c(18,17,25)

d <- function1(vec1,vec3,vec4,vec5)

# d should be a vector of length 3 as well with outcome 400,600,960 if I calculated correctly by hand

Этот код не выполняется, так как R, кажется, ожидает только одну строку кода после vec5 <20 вместо всех различных вычислений. Как я могу решить эту проблему? Спасибо за помощь! </p>

1 Ответ

3 голосов
/ 08 мая 2019

Если я правильно понял, ваша функция может быть уменьшена до

function1 <- function(vec1,vec3,vec4,vec5){
    ifelse(vec5 < 20, pmin(vec1 * 2 * vec3, vec1 * 4), 
         pmin(vec1 * 2 * vec3, vec1 * 4) + pmin(vec1 * 1.5 * vec4,vec1 * 4))
}

function1(vec1, vec3, vec4, vec5)
#[1] 400 600 960

Или еще лучше избежать повторного расчета и ifelse

function1 <- function(vec1,vec3,vec4,vec5){
  pmin(vec1 * 2 * vec3,   vec1 * 4) + 
      (pmin(vec1 * 1.5 * vec4,vec1 * 4)*(vec5 >= 20))
}

function1(vec1, vec3, vec4, vec5)
#[1] 400 600 960
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...