找到最接近的匹配时间戳并将坐标写入它 (R)

Finding the nearest matching timestamp and writing coordinates to it (R)

我正在进行一些生物学研究,包括将带有时间戳的短数字音频文件与时间同步的 GPS 设备一起录制到设备上。 GPS 的跟踪功能每 20 秒自动记录一个带时间戳的 xy 点,然后我手动将带时间戳的音频文件与最近的跟踪点匹配,以便以后在 GIS 软件中进行分析。这个过程很耗时,而且人为错误的可能性很大,所以我很想在 R 中找到一种方法来自动化这个过程。

所以我有 2 个 .csv 文件;

其中一个包含音频文件 ("calls") 和 hh:mm:ss 中的时间:

FileName  Time
M00002    22:09:29
M00015    22:12:36
M00016    22:12:41
M00017    22:12:57
M00019    22:13:18
M00032    22:18:55
M00035    22:19:13

等等

还有一个 "track" 文件,在 hh:mm:ss 中有 20 秒的时间间隔,X 和 Y 列的坐标为:

track_seg_point_id real.time         X        Y
1                    0  22:08:52 -1.886330 53.87816
2                    1  22:09:12 -1.886261 53.87811
3                    2  22:09:32 -1.886175 53.87808
4                    3  22:09:52 -1.886071 53.87806
5                    4  22:10:12 -1.885923 53.87805
6                    5  22:10:32 -1.885799 53.87803
7                    6  22:10:52 -1.885659 53.87800
8                    7  22:11:12 -1.885513 53.87797
9                    8  22:11:32 -1.885414 53.87795
10                   9  22:11:52 -1.885334 53.87793

我正在寻找一种方法将带时间戳的音频文件与最近的 20 秒跟踪点相匹配,然后将坐标写入 .csv 文件。这在 R 中可能吗?

数据

gps <- read.table(header = TRUE,
                  text = "track_seg_point_id real.time         X        Y
1                    0  22:08:52 -1.886330 53.87816
2                    1  22:09:12 -1.886261 53.87811
3                    2  22:09:32 -1.886175 53.87808
4                    3  22:09:52 -1.886071 53.87806
5                    4  22:10:12 -1.885923 53.87805
6                    5  22:10:32 -1.885799 53.87803
7                    6  22:10:52 -1.885659 53.87800
8                    7  22:11:12 -1.885513 53.87797
9                    8  22:11:32 -1.885414 53.87795
10                   9  22:11:52 -1.885334 53.87793")

gps$real.time <- strptime(gps$real.time, "%H:%M:%S")
lo <- read.table(header = TRUE,
                 text = "FileName  Time
M00002    22:09:29
M00015    22:12:36
M00016    22:12:41
M00017    22:12:57
M00019    22:13:18
M00032    22:18:55
M00035    22:19:13")

lo$Time <- strptime(lo$Time, "%H:%M:%S")

代码

timeDiffs <- outer(lo$Time, gps$real.time, FUN = `-`)
ret <- cbind(lo, gps[apply(timeDiffs, 1, function(.) which.min(abs(.))), ])

说明

首先,通过outer计算音频csv中所有时间戳与轨道csv中时间戳之间的差异。您会得到一个矩阵,其中音频时间戳与 gps 数据中每个时间戳之间的秒数差异。

timeDiffs[1:3,]
# Time differences in secs
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]   37   17   -3  -23  -43  -63  -83 -103 -123  -143
# [2,]  224  204  184  164  144  124  104   84   64    44
# [3,]  229  209  189  169  149  129  109   89   69    49

现在,我们对该矩阵的行进行应用以获得绝对值的最小值。最小值的索引是数据帧 gps 中最接近音频中相应时间戳的行。最后,我们cbind把两个文件放在一起:

#      FileName                Time track_seg_point_id           real.time
# 3      M00002 2015-07-13 22:09:29                  2 2015-07-13 22:09:32
# 10     M00015 2015-07-13 22:12:36                  9 2015-07-13 22:11:52
# 10.1   M00016 2015-07-13 22:12:41                  9 2015-07-13 22:11:52
# 10.2   M00017 2015-07-13 22:12:57                  9 2015-07-13 22:11:52
# 10.3   M00019 2015-07-13 22:13:18                  9 2015-07-13 22:11:52
# 10.4   M00032 2015-07-13 22:18:55                  9 2015-07-13 22:11:52
# 10.5   M00035 2015-07-13 22:19:13                  9 2015-07-13 22:11:52
#              X        Y
# 3    -1.886175 53.87808
# 10   -1.885334 53.87793
# 10.1 -1.885334 53.87793
# 10.2 -1.885334 53.87793
# 10.3 -1.885334 53.87793
# 10.4 -1.885334 53.87793
# 10.5 -1.885334 53.87793

现在,您可以使用 write.csvdata.frame 写回文件。