R 中基于多个条件对行进行排序

问题描述 投票:0回答:1

我正在处理包含超过 130 万个鱼类检测点的大型数据集。我正在尝试根据位置和时间戳数据计算距离和游泳速度。然而,我注意到数据的随机部分是无序收集的。例如,Fish #1 每 2-3 秒记录一次位置,但在某些情况下,时间戳为 22:00:05 的记录 A 后面跟着时间戳为 22:00:01 的记录 B。这对我来说是一个问题,因为我是根据连续记录之间的差异生成游泳速度。因此,在这种情况下,我最终得到的时间差值为 -4,这会产生负游泳速度...

这是我的数据的示例代码块。

Treatment <- c("Sound", "Sound", "Feed", "Control")
Time <- c("20:00:05", "20:00:01", "20:00:06", "21:00:01")
FishID = c("2897", "2897", "2897", "2744")
Date = c("5/13/2024", "5/13/2024", "5/13/2024", "5/14/2024")
FishData <- data.frame(FishID, Treatment, Time, Date)
FishData
FishID Treatment     Time      Date
1   2897     Sound 20:00:05 5/13/2024
2   2897     Sound 20:00:01 5/13/2024
3   2897      Feed 20:00:06 5/13/2024
4   2744   Control 21:00:01 5/14/2024

我想对列重新排序,使它们按时间顺序排列,同时保留各种分类分组。例如,我希望第 2 行位于第 1 行之前。

我不知道如何执行复杂的条件过滤任务。

r sorting filter conditional-statements large-files
1个回答
0
投票

基函数

order
可以稳定地对日期时间向量进行排序。
来自文档:

“radix”方法可以在线性时间内稳定地对逻辑向量、数字向量和字符向量进行排序。尽管存在缺点,但它优于其他方法,特别是对于字符向量(请参阅

sort
)。

sort
的文档中,我强调:

“radix”方法依赖于简单的散列来随输入大小线性缩放时间,即其渐近时间复杂度为 O(n)。该特定变体及其实现源自 data.table 包,由 Matt Dowle 和 Arun Srinivasan 完成。对于小输入(< 200), the implementation uses an insertion sort (O(n^2)) that operates in-place to avoid the allocation overhead of the radix sort. For integer vectors of range less than 100,000, it switches to a simpler and faster linear time counting sort. 在所有情况下,排序都是稳定的;关系的顺序被保留。这是整数向量和因子的默认方法。

因此,如果您创建按日期和时间排序的数据框行的排列,您将保留任何预先存在的顺序。

Treatment <- c("Sound", "Sound", "Feed", "Control")
Time <- c("20:00:05", "20:00:01", "20:00:06", "21:00:01")
FishID = c("2897", "2897", "2897", "2744")
Date = c("5/13/2024", "5/13/2024", "5/13/2024", "5/14/2024")
FishData <- data.frame(FishID, Treatment, Time, Date)

i <- FishData |>
  with(as.POSIXct(paste(Date, Time), format = "%m/%d/%Y %H:%M:%S")) |>
  order(method = "radix")
FishData[i,]
#>   FishID Treatment     Time      Date
#> 2   2897     Sound 20:00:01 5/13/2024
#> 1   2897     Sound 20:00:05 5/13/2024
#> 3   2897      Feed 20:00:06 5/13/2024
#> 4   2744   Control 21:00:01 5/14/2024

创建于 2024-09-21,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.