找到最近的匹配时间戳并为其写入坐标(R)

时间:2015-07-13 14:13:21

标签: r csv gps timestamp

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

所以我有2个.csv文件;

一个带有音频文件(“call”)和时间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

等等

带有20秒时间间隔的“轨道”文件,其中hh:mm:ss和带坐标的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?

1 个答案:

答案 0 :(得分:1)

数据

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写回文件。