【问题标题】:Finding the nearest matching timestamp and writing coordinates to it (R)找到最近的匹配时间戳并将坐标写入它(R)
【发布时间】:2015-10-01 20:35:58
【问题描述】:

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

所以我有 2 个 .csv 文件;

一个包含音频文件(“通话”)和时间在 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

等等

还有一个在 hh:mm:ss 和 X 和 Y 列中具有 20 秒时间间隔的“轨道”文件,其中包含坐标:

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 中可能吗?

【问题讨论】:

    标签: r csv gps timestamp


    【解决方案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 写回文件。

    【讨论】:

    • 这很好用,谢谢!将其调整为与 read.csv 一起使用以获取整个数据集
    猜你喜欢
    • 2021-10-06
    • 2016-11-25
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2015-08-19
    • 2022-11-27
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多