找到最接近的匹配时间戳并将坐标写入它 (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.csv
将 data.frame
写回文件。
我正在进行一些生物学研究,包括将带有时间戳的短数字音频文件与时间同步的 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.csv
将 data.frame
写回文件。