首页 > 解决方案 > 如何在 R 中创建特定函数来模拟生物学情况

问题描述

我需要编写一个函数来相对于它们的起点和它们的首选洞穴范围(在初始洞穴周围大约 3-8 个洞穴)进行袋熊运动

为此,我需要:

  1. 随机从 1 到 246 个洞穴(有 246 个洞穴)

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

  3. 为袋熊分配多个首选洞穴(3-8 个洞穴)

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

    • 如果奇数,没问题(例如 24 和 5 个洞穴 -> 22、23、24、25、26)
    • 如果是偶数,则与奇数相同,然后在左侧或右侧添加另一个数字(例如 24 和 4 洞穴 -> 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

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

标签: rfunctionmathmoduloagent

解决方案


以下功能可能会有所帮助:

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 的索引可能更可取。


推荐阅读