У меня есть матрица с n рядами наблюдений. Наблюдения представляют собой частотные распределения функций. Я хотел бы преобразовать частотные распределения в распределения вероятностей, где сумма каждой строки равна 1. Поэтому каждый элемент в матрице должен быть разделен на сумму строки элемента.Как преобразовать распределение частот в распределение вероятности в R
я написал следующую функцию R, что делает работу, но это очень медленно, с большими матрицами:
prob_dist <- function(x) {
row_prob_dist <- function(row) {
return (t(lapply(row, function(x,y=sum(row)) x/y)))
}
for (i in 1:nrow(x)) {
if (i==1) p_dist <- row_prob_dist(x[i,])
else p_dist <- rbind(p_dist, row_prob_dist(x[i,]))
}
return(p_dist)
}
B = matrix(c(2, 4, 3, 1, 5, 7), nrow=3, ncol=2)
B
[,1] [,2]
[1,] 2 1
[2,] 4 5
[3,] 3 7
prob_dist(B)
[,1] [,2]
[1,] 0.6666667 0.3333333
[2,] 0.4444444 0.5555556
[3,] 0.3 0.7
Не могли бы вы предложить функцию R, что делает работу и/или сказать мне, как я могу оптимизировать мои функции выполнять быстрее?
неможет (применяется (B, 1, prop.table)) '? –
Общий момент: поскольку вы сделали первую строку специальным случаем, вычислите ее вне своего цикла и выполните 'for (in 2: nrow (x))' и удалите 'if/else' внутри цикла. Далее, так как вы заранее знаете размерную матрицу вывода, создайте пустую 'p_dist <-matrix (NA, nrow = nrow (x), ncol = ncol (x))'. Все это время траты «rbind». –
@DavidArenburg, вы можете упомянуть, что 'prop.table' является просто ярлыком для' sweep' –