- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个月的数据文件,每个文件包含两个 25x25x20m 养鱼围栏中 40 条标记鱼的鱼 x、y、z 坐标的 24 小时记录,每个标记每 6-9 秒定位一次。每个文件包含大约 365,000 个观察值。
我想计算鱼每天覆盖围栏的比例。我已经编写了一些 R 代码来完成这项工作,但由于文件很大,运行大约需要 4 个小时。这是我的代码:
xmin <- 8
ymin <- 11.5
xmax <- 33
ymax <- 36.5
boxsize <- 1
# define coverage grid
cov.grid <- matrix(c(xmin,ymin), nrow = 1, ncol = 2, byrow = FALSE)
colnames(cov.grid) <- c('x','y')
x <- xmin
y <- ymin
while(x < xmax)
{
while(y < ymax)
{
y <- y+boxsize
cov.grid <- rbind(cov.grid, c(x,y))
}
x <- x+boxsize
y <- ymin
cov.grid <- rbind(cov.grid, c(x,y))
}
cov.grid <- as.data.frame(cov.grid)
# count grid cells occupied by fish
day.row <- 1
grid.row <- 1
bin <- 0
cov.grid$occupied <- NA
for(grid.row in 1:nrow(cov.grid)){
x1 <- cov.grid[grid.row,1]
y1 <- cov.grid[grid.row,2]
x2 <- x1+boxsize
y2 <- cov.grid[grid.row+1,2]
repeat
{
if(dayfile[day.row,'PosX'] > x1 & dayfile[day.row,'PosX'] < x2 & dayfile[day.row,'PosY'] > y1 & dayfile[day.row,'PosY'] < y2) {bin <- 1} else {bin <- 0}
day.row <- day.row+1
if(bin == 1 | day.row == nrow(dayfile)){break}
}
cov.grid[grid.row,'occupied'] <- bin
day.row <- 1
}
# return coverage summary
coverage <- matrix(c(length(which(cov.grid$occupied == 1)), nrow(cov.grid), length(which(cov.grid$occupied == 1))/nrow(cov.grid)), ncol = 3)
colnames(coverage) <- c('occupied', 'total', 'proportion')
coverage
代码逻辑如下:
理想情况下,我希望网格分辨率为 0.1m 分辨率,但即使是 1m 分辨率也需要 4 小时才能运行; 25x25m 网格阵列 = 625 个单元格,因此 365,000 条鱼类观测值的坐标文件必须与网格阵列交叉制表 625 次。如果网格分辨率为 0.1m,则 365,000 个观测值需要交叉制表 625,000 次,这可能需要数周时间!
我相信一定有更有效的方法来做到这一点。但是,我现在才学习 R 几个月,所以我不确定如何改进代码。
如有任何帮助或建议,我们将不胜感激!
最佳答案
您根本不需要使用循环。执行以下操作:
compute.coverage <- function(xmin, xmax, ymin, ymax, boxsize, dayfile) {
x.grid <- floor((dayfile$PosX - xmin) / boxsize) + 1
y.grid <- floor((dayfile$PosY - ymin) / boxsize) + 1
x.grid.max <- floor((xmax - xmin) / boxsize) + 1
y.grid.max <- floor((ymax - ymin) / boxsize) + 1
t.x <- sort(unique(x.grid))
t.y <- sort(unique(y.grid))
tx.range <- c(min(which(t.x > 0)), max(which(t.x <= x.grid.max)))
ty.range <- c(min(which(t.y > 0)), max(which(t.y <= y.grid.max)))
t <- table(y.grid, x.grid)[ty.range[1]:ty.range[2],tx.range[1]:tx.range[2]]
grid.cov <- matrix(0,nrow=y.grid.max,ncol=x.grid.max)
t.x <- t.x[(t.x > 0) & (t.x <=x.grid.max)]
t.y <- t.y[(t.y > 0) & (t.y <=y.grid.max)]
eg <- expand.grid(t.y,t.x)
grid.cov[cbind(eg$Var1,eg$Var2)] <- as.vector(t)
coverage <- matrix(c(length(which(grid.cov > 0)), length(grid.cov), length(which(grid.cov > 0))/length(grid.cov)), ncol = 3)
colnames(coverage) <- c('occupied', 'total', 'proportion')
coverage
}
此计算的关键是像 Rufo(另一个答案)那样为每个观察计算网格框位置 (x.grid,y.grid)
。然而,这里的计算是向量化所有 dayfile
中的观察,其复杂度独立的分辨率网格!诀窍是然后使用 table
计算每个 (x.grid,y.grid)
组合的占用频率。这里有两个复杂的因素:
(xgrid,y.grid)
位置可能在您的笔外 (xmin,xmax,ymin,ymax)
。如果你只对覆盖百分比感兴趣,第二个问题是不相关的,但如果你真正关心哪个框位置被占用,它是相关的。上面的代码通过以下方式处理:
tx.range
和 ty.range
。grid.cov
。此处,grid.cov
是对应于您的 cov.grid
变量的笔矩阵。它的元素记录了第 i
行和 j
列的盒子的占用数量,所以这实际上比你的 occupied
,它只指定该框是否已被占用(至少一次)。为了检测一个框是否已被占用,我们评估 grid.cv > 0
。在我的 2 GHz Macbook 上用 365,000 次模拟观察在 dayfile
上以 0.1 米分辨率的网格运行此程序花费了不到 2 秒:
xmin <- 8
ymin <- 11.5
xmax <- 33
ymax <- 36.5
boxsize <- 0.1
## simulate dayfile
set.seed(123)
PosX <- runif(365000,xmin-2,xmax+2)
PosY <- runif(365000,ymin-2,ymax+2)
dayfile <- data.frame(PosX=PosX,PosY=PosY)
print(system.time(coverage <- compute.coverage(xmin,xmax,ymin,ymax,boxsize,dayfile)))
## user system elapsed
## 1.096 0.052 1.193
print(coverage)
## occupied total proportion
##[1,] 62168 63001 0.986778
关于r - 如何根据点数据计算区域的覆盖范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39511756/
我不能解决这个问题。和标题说的差不多…… 如果其他两个范围/列中有“否”,我如何获得范围或列的平均值? 换句话说,我想计算 A 列的平均值,并且我有两列询问是/否问题(B 列和 C 列)。我只希望 B
我知道 python 2to3 将所有 xrange 更改为 range 我没有发现任何问题。我的问题是关于它如何将 range(...) 更改为 list(range(...)) :它是愚蠢的,只是
我有一个 Primefaces JSF 项目,并且我的 Bean 注释有以下内容: @Named("reportTabBean") @SessionScoped public class Report
在 rails3 中,我在模型中制作了相同的范围。例如 class Common ?" , at) } end 我想将公共(public)范围拆分为 lib 中的模块。所以我试试这个。 module
我需要在另一个 View 范围 bean 中使用保存在 View 范围 bean 中的一些数据。 @ManagedBean @ViewScoped public class Attivita impl
为什么下面的代码输出4?谁能给我推荐一篇好文章来深入学习 javascript 范围。 这段代码返回4,但我不明白为什么? (function f(){ return f(); functio
我有一个与此结构类似的脚本 $(function(){ var someVariable; function doSomething(){ //here } $('#som
我刚刚开始学习 Jquery,但这些示例对我帮助不大...... 现在,以下代码发生的情况是,我有 4 个表单,我使用每个表单的链接在它们之间进行切换。但我不知道如何在第一个函数中获取变量“postO
为什么当我这样做时: function Dog(){ this.firstName = 'scrappy'; } Dog.firstName 未定义? 但是我可以这样做: Dog.firstNa
我想打印文本文件 text.txt 的选定部分,其中包含: tickme 1.1(no.3) lesson1-bases lesson2-advancedfurther para:using the
我正在编写一些 JavaScript 代码。我对这个关键字有点困惑。如何在 dataReceivedHandler 函数中访问 logger 变量? MyClass: { logger: nu
我有这个代码: Public Sub test() Dim Tgt As Range Set Tgt = Range("A1") End Sub 我想更改当前为“A1”的 Tgt 的引
我正忙于此工作,以为我会把它放在我们那里。 该数字必须是最多3个单位和最多5个小数位的数字,等等。 有效的 999.99999 99.9 9 0.99999 0 无效的 -0.1 999.123456
覆盖代码时: @Override public void open(ExecutionContext executionContext) { super.open(executio
我想使用 preg_match 来匹配数字 1 - 21。我如何使用 preg_match 来做到这一点?如果数字大于 21,我不想匹配任何东西。 example preg_match('([0-9]
根据docs range函数有四种形式: (range) 0 - 无穷大 (range end) 0 - 结束 (range start end)开始 - 结束 (range start end st
我知道有一个UISlider,但是有人已经制作了RangeSlider(用两个拇指吗?)或者知道如何扩展 uislider? 最佳答案 我认为你不能直接扩展 UISlider,你可能需要扩展 UICo
我正在尝试将范围转换为列表。 nums = [] for x in range (9000, 9004): nums.append(x) print nums 输出 [9000] [9
请注意:此问题是由于在运行我的修饰方法时使用了GraphQL解析器。这意味着this的范围为undefined。但是,该问题的基础知识对于装饰者遇到问题的任何人都是有用的。 这是我想使用的基本装饰器(
我正在尝试创建一个工具来从网页上抓取信息(是的,我有权限)。 到目前为止,我一直在使用 Node.js 结合 requests 和 Cheerio 来拉取页面,然后根据 CSS 选择器查找信息。我已经
我是一名优秀的程序员,十分优秀!