Как использовать несколько функций на основе условия с помощью lapply - PullRequest
1 голос
/ 02 мая 2019

У меня есть вопрос, касающийся использования нескольких функций в условии с использованием условия.Вот кадр данных

Data <- data.frame(c(1:6),c(7:12), c(1,0,1,0,1,1), 0)
colnames(Data) <- c("a","b","c","d")

Я хочу, чтобы выход выводился к каждой строке на основе условия, как в этом случае, если col c равно 1, я хочу использовать функцию min, а если col c0 Я хочу использовать функцию max.

Я пробовал это

Output <- lapply(Data$d, if(Data$c == 1){min(Data$b - Data$c, Data$a)} else 
{max(Data$b - Data$c, Data$a)})

, но условие не основано на одной ячейке, а скорее занимает весь столбец, как я могу получить этоусловие для клетки в этой конкретной строке?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Мы можем векторизовать с pmin/pmax и использовать ifelse вместо if/else

with(Data, ifelse(c == 1, pmin(b - c, a), pmax(b, a)))

Обратите внимание, что для выражения "нет" нам не нужно b-c, поскольку 'c' равно 0 для столбца

1 голос
/ 02 мая 2019

Я не очень знаком с R, но эти ситуации обычно требуют «переключения». Когда есть одно условие для оценки и 2 или более результатов, переключение, как правило, является ясным способом сделать что-то.

Может быть:

Output <- switch(Data$c, 
1 = min(Data$b - Data$c, Data$a),
0 = max(Data$b - Data$c, Data$a))

Мне нравятся переключатели, потому что они очень ясно показывают, что происходит. Кроме того, если вам нужно добавить «по умолчанию» или несколько параметров, это очень просто.

Я не могу обещать, что код там будет работать, потому что я не знаю R, но, возможно, это толчок в правильном направлении? :)

...