我正在进行一些生物学研究,包括将短时间标记的数字音频文件与时间同步的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?
中答案 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.csv
将data.frame
写回文件。