#r
#r
Вопрос:
Предполагая, что у меня есть:
weights <- c(0.15, 0.25, 0.11, 0.9, 0.35, 0.05)
И следующая таблица данных Phones
:
make model price users rating continent market years success
Nokia 3310 800 5000 5 Europe 4000000 30 yes
Huawei Foto 500 10000 7 Asia 1200000 10 no
Apple XS 1500 90000 8 NAmerica 4200000 8 yes
Mi 125 300 500 5 Asia 300000 3 yes
Я хочу добавить новый столбец с именем Impact
, который представляет собой вес, умноженный на столбцы price, users, rating, market, and years
Пока я могу получить среднее значение столбцов, используя:
Phones$wt <- rowMeans(subset(Phones, select = c(price, users, rating, market, years)), na.rm = TRUE)
Итак, я хочу получить средневзвешенное значение в зависимости от весов, которые я выбрал вручную.
Комментарии:
1. Помогает ли это
Phones$wt <- apply(dplyr::select(Phones, price, users, rating, market, years), 1, function(x) { mean(x * weights) }
?2. Также, пожалуйста, поделитесь фреймом данных
Phones
сdput
Ответ №1:
Средневзвешенное значение такое же, как при умножении матрицы, за исключением того, что вы дополнительно делите результат на сумму весов. У вас есть 6 весов и 5 столбцов, поэтому я удалил последний вес.
m <- as.matrix(subset(Phones, select = c(price, users, rating, market, years)))
weights <- c(0.15, 0.25, 0.11, 0.9, 0.35)
m %*% weights / sum(weights)
# [,1]
# [1,] 2046239.2
# [2,] 615101.9
# [3,] 2160641.3
# [4,] 153506.6
Используемые данные:
Phones <- data.table::fread('
make model price users rating continent market years success
Nokia 3310 800 5000 5 Europe 4000000 30 yes
Huawei Foto 500 10000 7 Asia 1200000 10 no
Apple XS 1500 90000 8 NAmerica 4200000 8 yes
Mi 125 300 500 5 Asia 300000 3 yes
')
Ответ №2:
Обратите внимание, что взвешенное среднее значение по набору критериев с разными диапазонами практически бессмысленно. Например, небольшие процентные различия на рынке затмевают большие процентные различия в рейтинге. Вы должны нормализовать вектор каждого столбца, а затем применить веса. Также я предполагаю, что низкая цена лучше, поэтому нормализацию следует выполнять по обратному отношению к этим значениям. Итак, ваша нормализованная матрица будет выглядеть следующим образом: