Есть несколько подходов, которые вы можете предпринять. Ниже приведены несколько примеров построения функции «f», чтобы «f (x, y)» соответствовало вашим критериям, указанным в вопросе, с использованием логики, отличной от операторов «ifelse». Примечание. Я также добавляю одну поправку к исходному сообщению, так как "x=70" нарушит логику. Я добавляю "x>=70" ко второму критерию.
Вариант 1. Используйте стандартный логический блок if / else if / else. Лично мне этот вариант нравится, потому что он легко читается.
f <- function(x, y){
if (y>= 50){
return(0.2*x+0.8*y)
} else if (y < 50 & x >= 70){
return(y+10)
} else {
return(y)
}
}
Вариант 2. Объедините два логических теста (на самом деле их всего два) в строку и используйте переключатель. Обратите внимание, что последняя и безымянная опция рассматривается как «еще».
f <- function(x, y){
return(
switch(paste(x >= 70, y >= 50, sep=""),
TRUEFALSE = y + 10,
FALSEFALSE = y,
0.2*x+0.8*y
)
)
}
Вариант 3. Упорядочите операторы if, чтобы уменьшить количество логических сравнений. Это то, что нужно делать, если у вас большой набор данных или очень ограниченная память. Это немного сложнее устранить, так как вам нужно прочитать весь блок, чтобы полностью понять его. Вариант 1 лучше, если у вас нет ограничений по памяти или циклу.
f <- function(x, y){
if (y >= 50){
return(0.2*x+0.8*y)
} else {
if (x >=70){
return(y+10)
} else {
return(y)
}
}
}
Есть и другие варианты, но это самые простые, которые приходят на ум.
person
Dinre
schedule
06.02.2013
ifelse
? Является лиy
вектором? Являются лиif
иelse
подходящей альтернативойifelse
? - person user1317221_G   schedule 06.02.2013ifelse
? - person Sven Hohenstein   schedule 06.02.2013switch
. Преимущество здесь в том, что она может легко менять точки отсечки илиy
- манипуляции. - person Carl Witthoft   schedule 06.02.2013switch
довольно удобен, и вы все равно не можете векторизовать серию if ... else (за исключением особых случаев), а переключатель останавливается при первом выполненном условии (проверьте руководство). - person Carl Witthoft   schedule 28.03.2014