听起来您可能需要三件潜在的帮助:算法、数学或 R 语法。
您需要的算法可能取决于您的数据的具体情况。例如,您有多少数据?它是什么格式的?它是 2D 还是 3D?一种可能性是遍历您的数据集。对于每个新点,您需要检查所有以前的点,看看它们是否在您想要的列中。但是,如果数据集很大,这可能真的很慢。最坏的情况是,所有数据点都在一个航段中,这意味着您将检查第一个点的次数与您有数据点的次数相同,第二个点少一次,等等。这意味着 n + (n-1) + (n-2) + ... + 1 = n(n-1)/2 次操作。那是 O(n^2); 相对于数据集的大小,操作时间可能呈二次增长。因此,您可能需要更复杂的东西。
检查一个点是否在所需的 x 列内的数学非常简单,尽管更复杂的数学可能有助于为更好的算法提供信息。一种方法是使用矢量算术。举个例子,假设您有点 A、B 和 C。您的目标是查看 B 是否落在从 A 到 C 的向量周围的宽度为 x 的列中。为此,找到与 C 正交的向量 v,然后看向量从A到B到v上的标量投影的大小是否小于x。有很多文献可以帮助解决这类问题,这里有一个例子。
我认为这是我可能开始的地方(对单个点使用布尔函数),因为确定这一点的 R 函数似乎很方便。然后另一个函数获取一组点并计算向量 v 并为集合中的每个点调用第一个函数。然后运行一些数据,看看需要多长时间。
恐怕我不会对 R 语法有太大帮助,尽管它在我想学习的东西的清单上。昨晚我查看了 R 手册,里面有很多有用的例子。我相信这是非常可行的,即使对于像我这样的 R 新手也是如此。如果你有一个大数据集,它可能会有点慢。但是,有了一些可行的方法,也可能更容易从具有更多知识和经验的人那里获得帮助来优化它。
两个快速澄清点,以防它们有帮助:
- 上面的建议只是从单一动物的数据开始,所以当我谈论数据增长时,我指的是单一动物的平均数据样本量。如果这很慢,您可能需要先修复它。然后,您需要潜在地分析/优化用于处理多种动物的算法。
- 我隐含地假设航段的定义是连续数据点的最大子集,其中没有“子”航段违反列规则。也就是说,我想我可以想出一个例子,其中一组点满足你的规则,即落在向量周围宽度 x 的列中到最后一个点,但是如果你查看宽度 x 的列周围向量到倒数第二个点,一个点将不再符合标准。根据您定义航段的方式(例如,如果您希望它是满足您的条件并且不关心内部发生的情况的最大可能点集),您可能需要一些不同的东西(例如,向后而不是向前工作)。