【发布时间】:2013-02-09 23:56:40
【问题描述】:
我知道使用 R 强大的向量处理功能可以使这段代码更短、更高效。我只是现在无法弄清楚如何......
基本任务是调整每行中的单元格,以便强制行总数与由另一个数据框确定的预定义数字相匹配。这样每个区域的总人口被强制为某个值(每一行代表一个区域),而从一列移动到下一列的单元格之间的比率保持不变。
丑陋的做法(第一个循环只是创建一个示例数据框;当然可以做得更好;我就是不能停止使用循环!):
con1 <- array(dim=c(5,3))
set.seed(1066)
for(i in 1:ncol(con1)){
con1[,i] <- round(rnorm(n=5,mean=10,sd=3))}
con1 <- data.frame(con1)
con2 <- data.frame(array(c(8:13, 9:14, 10:15), dim=c(5,3)))
apply(con1,1, sum)
apply(con2,1, sum) # different row totals
con1.adj <- con1
for ( i in 1:nrow(con1)){
con1.adj[i,1] <- con1[i,1] * ( sum(con2[i,]) / sum(con1[i,]) )
con1.adj[i,2] <- con1[i,2] * ( sum(con2[i,]) / sum(con1[i,]) )
con1.adj[i,3] <- con1[i,3] * ( sum(con2[i,]) / sum(con1[i,]) )
}
con1.adj <- data.frame(con1.adj)
apply(con1.adj,1, sum) # same row totals
(上下文:从别人的工作中挖出这段代码并愉快地使用了一段时间。现在我已经在陡峭的 R 学习曲线上稍微上升了一点,这对我来说看起来很糟糕。也希望代码能够重新- 被其他人使用。真的很喜欢这门语言,如果我能找到更漂亮的方式,我会更喜欢它)
【问题讨论】:
-
apply(con1,1, sum)和类似的行在您的代码中没有实际价值。您只需计算总和,不要将其存储在任何地方! -
感谢您的提示,但我已经知道了!它是为了在家用计算机上执行上述步骤的人的利益。它不包含在我正在使用的代码中,这会使它更加丑陋(如果可能的话:)
标签: r loops performance