【发布时间】:2013-02-24 08:10:03
【问题描述】:
对于 R 和更重要的矢量化,我仍然耳后一片空白,我无法弄清楚如何加快下面的代码。
for 循环通过对每个种子应用随机概率,为具有不同密度的种子生成植物的几个路段计算落在道路上的种子数量。 由于我的真实数据框有大约 200k 行,种子数高达 300k/segment,因此在我当前的机器上使用下面的示例将需要几个小时。
#Example data.frame
df <- data.frame(Density=c(0,0,0,3,0,120,300,120,0,0))
#Example SeedRain vector
SeedRainDists <- c(7.72,-43.11,16.80,-9.04,1.22,0.70,16.48,75.06,42.64,-5.50)
#Calculating the number of seeds from plant densities
df$Seeds <- df$Density * 500
#Applying a probability of reaching the road for every seed
df$SeedsOnRoad <- apply(as.matrix(df$Seeds),1,function(x){
SeedsOut <- 0
if(x>0){
#Summing up the number of seeds reaching a certain distance
for(i in 1:x){
SeedsOut <- SeedsOut +
ifelse(sample(SeedRainDists,1,replace=T)>40,1,0)
}
}
return(SeedsOut)
})
如果有人能给我一个提示,告诉我如何用矢量化代替循环 - 或者首先如何更好地组织数据以提高性能 - 我将非常感激!
编辑: Roland 的回答表明我可能过于简化了这个问题。在 for 循环中,我从另一位作者记录的距离分布中提取一个随机值(这就是为什么我不能在这里提供数据的原因)。添加了一个示例向量,其中包含 SeedRain 距离的可能值。
【问题讨论】:
-
一个小插曲:在
if(x > 0)中,x是一个向量,所以这可能不是你想要的。此外,如果您的所有数据都是数字数据,那么在处理性能问题时,坚持使用矩阵而不是数据框通常是一个好主意。 -
@joran
x不会是一个向量,因为整个输入是一个 1 列矩阵,apply()是在行上运行的。 -
@GavinSimpson 啊,谢谢。我读得太快了。
标签: performance r for-loop vectorization