【发布时间】:2015-03-31 19:35:09
【问题描述】:
我有一个包含 n 行观察值的矩阵。观测值是特征的频率分布。我想将频率分布转换为每行之和为 1 的概率分布。因此,矩阵中的每个元素都应除以该元素的行之和。
我编写了以下 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 函数来完成这项工作和/或告诉我如何优化我的函数以更快地执行?
【问题讨论】:
-
t(apply(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的快捷方式
标签: r matrix probability apply frequency-distribution