如何在 R 中创建特定函数来模拟生物情况

How do I make a specific function in R to simulate a biological situation

我需要编写一个函数来让袋熊相对于它们的起点和它们喜欢的洞穴范围(在开始的洞穴周围大约 3-8 个洞穴)移动

为此,我需要:

  1. 将洞穴从 1 打乱到 246(共有 246 个洞穴)

  2. Select 在随机洞穴中启动的第一部分人口

  3. 为袋熊指定多个首选洞穴(3-8 个洞穴)

  4. 对于每个有起始位置的袋熊,为其初始洞穴的每一侧提供连续的洞穴 ID。但是,这是出现的条件:

    • 如果是奇数,没问题(例如 24 和 5 个洞穴 -> 22、23、24、25、26)
    • 如果是偶数,则与奇数相同,然后在左侧或右侧添加另一个数字(例如 24 和 4 burrows -> 22, 23, 24, 25)
  5. 将挖洞范围的选择做模运算,从246个挖洞结束的开始,他们喜欢的挖洞可以继续打1号挖洞,以此类推

我应该如何从逻辑上解决这个问题?

所以洞穴的排列方式是它们排列成圆形(栖息地的边缘)。我以为我可以执行 %% 函数来创建模函数,但我不知道如何执行数字 4 和 5 以及如何将所有内容合并为一个函数。

到目前为止,我想出了 5 步中的第 3 步...

burrownum = (1:246) #set number of burrows

rand_burrownum = permute::shuffle(burrownum) #randomise the burrows

assignbur2wom = as.data.frame(rand_burrownum[1:24]) #assign wombats (per set proportion - 24 for 10%, 43 for 17.5%, 61 for 25%) to initial burrow 

wombatID = as.data.frame(1:24) #ID of each wombats - need to change the number of individuals

assignpref2wom = as.data.frame(sample(3:8, 24, replace = TRUE))#sample how many of burrows each wombat prefers - need to change number of individuals

wombatdat$WomID = wombatID

wombatdat$InitialBurrows = assignbur2wom

wombatdat$NumBPref = assignpref2wom

我想要一个创建这些条件的函数。我知道这很复杂,如果还有什么我可以澄清的,请告诉我!

以下函数可能会有所帮助:

assign.burrows <- function(i,k,n = 246) {
  a <- floor(i - 1 - (k-1)/2)
  b <- floor(i - 1 + (k-1)/2)
  1 + (a:b) %% n
}

典型运行:

> assign.burrows(24,5)
[1] 22 23 24 25 26
> assign.burrows(24,4)
[1] 22 23 24 25
> assign.burrows(246,4)
[1] 244 245 246   1
> assign.burrows(246,5)
[1] 244 245 246   1   2
> assign.burrows(2,5)
[1] 246   1   2   3   4

请注意,使用基于 1 的洞穴编号索引会使事情变得更加复杂,因为它不能很好地与模块化算法一起使用。使用基于 0 的索引(以便洞穴编号从 0 到 245),您可以使用:

assign.burrows <- function(i,k,n = 246) {
  a <- floor(i - (k-1)/2)
  b <- floor(i + (k-1)/2)
  (a:b) %% n
} 

另一方面,基于 1 的索引更适合 R 数据结构,因此总的来说坚持使用 R 的基于 1 的索引可能更可取。