Рассчитать взвешенные результаты по рядам - PullRequest
2 голосов
/ 26 марта 2019

Я ищу более элегантный способ вычисления взвешенной оценки в 7 столбцов следующим образом.

Каждый столбец представляет оценку состояния (от 1 до 7), наблюдения представляют процентную долю, наблюдаемую при этой оценке (каждая строка должна составлять 1).

Взвешенная оценка - это просто сумма каждой переменной строки, умноженная на ее оценку состояния.

Создать набор данных:

rand.sum <- function(n) {
  x <- sort(runif(n-1))
  c(x,1) - c(0,x)
}

df <- t(replicate(10,rand.sum(7)))
colnames(df)<-c(1:7) # Change the column names to reflect condition value
df <- as.data.frame(df)

Создать столбец взвешенной оценки (по-моему ...):

df$weightedCondScore <- ((df[,1]) * 1) + ((df[,2]) * 2) + 
                        ((df[,3]) * 3) + ((df[,4]) * 4) + 
                        ((df[,5]) * 5) + ((df[,6]) * 6) + 
                        ((df[,7]) * 7)

Есть ли лучший способ вычислить взвешенную оценку, ссылаясь на имена столбцов (оценки) и функцию цикла? Набор данных содержит намного больше столбцов, и я не хочу исправлять нумерацию индекса в случае, если она изменяется при добавлении дополнительных переменных.

Ответы [ 2 ]

4 голосов
/ 26 марта 2019

Простой способ получить это - это умножить матрицу на вектор.

M = as.matrix(df)
M %*% 1:ncol(M)
1 голос
/ 26 марта 2019

Если вы хотите создавать функции для быстрых задач, вы можете использовать семейную функцию apply для работы со столбцами, взвешивающими значения, а затем использовать rowSums, чтобы присвоить счет обратно вашему фрейму данных.

weighted <- sapply(1:ncol(df), function(i) df[,i] * i)
df$weightedCondScore <- rowSums(weighted)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...