关于 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)
})
如果有人可以提示我如何用矢量化代替循环 - 或者首先如何更好地组织数据以提高性能 - 我将非常感激!
编辑:罗兰的回答表明我可能过度简化了这个问题。在 for 循环中,我从另一位作者记录的距离分布中提取随机值(这就是为什么我不能在这里提供数据的原因)。添加了一个示例向量,其中包含 SeedRain 距离的可能值。