Учитывая ваше определение эффективности - меньше строк кода, я думаю, это то, что вы ищете, используя ваш метод 1, мы просто устраняем необходимость во втором бите:
Grade = ifelse(Df$Gender == "M", as.vector(cut(Df$Marks, breaks = c(0, 34, 45, 56, 101), labels = c("D", "C", "B", "A"))),
as.vector(cut(Df$Marks, breaks = c(0, 39, 50, 61, 101), labels = c("D", "C", "B", "A"))))
> head(Grade)
[1] "C" "B" "A" "D" "B" "A"
Итак, нужна одна строка кода.
Примечание. Вы можете сделать код более гибким, заменив каждый фрагмент кода, например,
labs <- c("D", "C", "B", "A")
И, поместив переменную labs в код, теперь вы можете просто изменить один бит вашего кода вверху, а затем повторно использовать свои функции для различных систем оценивания и т. Д. *
Используемый код:
set.seed(1234)
Marks <- rnorm(100, 55, 10)
z <- runif(100)
Gender <- ifelse(z < 0.5, "M", "F")
Df <- data.frame(SNo = 1:100, Marks, Gender)