我有一个数据集,其中包括物种列表、它们的数量以及调查开始时的天数。由于没有采样很多天,因此一天不是连续的。因此,例如,可能在第 5、6、9、10、15、34、39 天计数鸟类等等。我将最早的日期设置为第 0 天。
示例数据:
species counts day
Blue tit 234 0
Blue tit 24 5
Blue tit 45 6
Blue tit 32 9
Blue tit 6 10
Blue tit 98 15
Blue tit 40 34
Blue tit 57 39
Blue tit 81 43
..................
我需要引导这些数据并获得一个结果数据集,我在其中指定何时开始、继续进行的时间间隔以及要采样的点数。
示例:假设我随机选择第 5 天作为开始日期,间隔为 30,采样的行数为 2。这意味着我将从 5 开始,添加 30,并在 35 天左右寻找 2 行(但不是第 35 天本身)。在这种情况下,我将抓取第 34 天和第 39 天的两行。
接下来,我将 30 添加到 35 并在 65 附近寻找两个点。冲洗,重复直到我到达数据集的末尾。
我编写了这个函数来进行采样,但它有缺陷(见下文):
resample <- function(x, ...) x[sample.int(length(x), ...)]
locate_points<- function(dataz,l,n) #l is the interval, n is # points to sample. This is called by another function that specifies start time among other info.
{
tlength=0
i=1
while(tlength<n)
{
low=l-i
high=l+i
if(low<=min(dataz$day)) { low=min(dataz$day) }
if(high>=max(dataz$day)) { high=max(dataz$day) }
test=resample(dataz$day[dataz$day>low & dataz$day<high & dataz$day!=l])
tlength=length(test)
i=i+1
}
test=sort(test)
k=test[1:n]
return (k)
}
我需要帮助的两个问题:
虽然我的函数确实返回了所需的点数,但它并不以我的搜索值为中心。这是有道理的,因为随着我变得更宽,我得到更多的点,当我对它们进行排序并选择第一个 n 时,它们往往不是低值。
其次,我如何得到实际的行?现在我有另一个函数可以使用
which
, 然后将rbind
这些行放在一起来定位这些行。似乎应该有更好的方法。
谢谢!