我有几个月的数据文件,每个文件都包含两个25x25x20米的鱼场笼内40条已标记鱼在24小时内每6-9秒记录一次的鱼的x、y、z坐标。每个文件包含约365,000个观测值。
代码逻辑如下:
我相信肯定有更有效的方法来完成这个任务。然而,我学习R语言才几个月,不知道如何改进代码。
非常感谢您的帮助和建议!
我想计算每天被鱼覆盖的鱼笼比例。我编写了一些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
代码逻辑如下:
- 创建一个笔区域的矩阵网格。
- 针对每个网格单元,查看鱼的坐标文件,检查是否有鱼占据该单元;如果是,则为1,否则为0。
- 向网格矩阵添加一列,记录每个单元是否被鱼占据。
- 计算占据单元的数量,并计算笔覆盖率的比例。
我相信肯定有更有效的方法来完成这个任务。然而,我学习R语言才几个月,不知道如何改进代码。
非常感谢您的帮助和建议!