#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)