R функция ifelse возвращает только оценку последней строки

#r

#r

Вопрос:

У меня есть матрица из цифр размером 200 x 10, либо 2, либо 7, называемая предсказаниями.

Я пытаюсь вернуть большинство для каждой строки, используя этот код.

 for (i in 1:nrow(predictions)) {
  if_else(mean(predictions[i,] == 7) > 0.5, 7, 2)
}
 

Это вообще ничего не возвращает на консоль.

Если я попытаюсь присвоить ей переменную следующим образом:

 for (i in 1:nrow(predictions)) {
  if_else(mean(predictions[i,] == 7) > 0.5, 7, 2)
} -> ens
 

она возвращает результат для последней строки.

Если я попытаюсь присвоить ей переменную в начале, переменная содержит NULL:

 ens <- for(i in 1:nrow(predictions)) {
  if_else(mean(predictions[i,] == 7) > 0.5, 7, 2)
}
 

Чего мне не хватает?

Ответ №1:

Ваш предыдущий код ничего не возвращает, потому что вы не сохраняете результаты каждой итерации. Чтобы вернуть большинство для каждой строки, минимальное количество изменений для достижения желаемого должно быть таким:

 majority <- c()
for(i in 1:nrow(predictions)){
  majority[i] <- if_else(mean(predictions[i,]==7)>0.5,7,2) 
}
 

Затем, в зависимости от того, что вы хотели сделать с вектором большинства, вы могли бы либо изменить номер строки, либо привязать его к исходной матрице прогнозов.

Редактировать

Если вы хотите отказаться от использования циклов for , вы можете использовать операторы apply . Если вы хотите остаться в tidyverse (я вижу, что вы используете dplyr::if_else() ), ознакомьтесь с purrr семейством map() функций.

Ответ №2:

Я думаю, вы хотите использовать apply здесь в режиме строки:

 ens <- apply(predictions, 1, function(x) {
    if (mean(x == 7) > 0.5) 7 else 2
})
 

Обратите внимание, что я использую if ... else обычную невекторизованную логику потока, поскольку мы имеем дело со скалярными агрегатами каждой строки в анонимной функции, которой передается apply() .

Ответ №3:

Обычно вы не хотите или не нуждаетесь в обработке содержимого фрейма данных с for помощью циклов. Вы можете сгенерировать среднее значение строки в виде вектора с rowMeans помощью функции. Попробуй:

 result <- ifelse(rowMeans(predictions) > 0.5, 7, 2)