R:数据帧行对的插入中间值

问题描述 投票:0回答:1

我有一系列的记录每2.5分钟后加入这些到QGIS地图从Strava坐标。我想通过之间采取每一对的经度和纬度的平均插值点。

我知道我可以使用一个for循环,但我“宁愿使用功能的申请家庭的一员。我知道我需要采取的当前行,然后下一行所有,但最后一排。

gpsSmall是一个data.frame看起来像这样

activity_no lat     lon
----------- ---     ---
1           52.5111 -1.85222
1           52.5111 -1.86224
1           52.5111 -1.87226
... etc
2           52.6189 -1.85332
2           52.6284 -1.86332
2           52.6386 -1.87332
... etc

我然后写入这些函数来创建,我将rbind到年底的额外行。

splitPoints <- function(point1, point2) {
    meanLatitude = (point1$lat + point2$lat)/2
    meanLongitude = (point1$lon + point2$lon)/2

    point1$lat = meanLatitude
    point1$lon = meanLongitude

    point1
}

newPoints <- sapply(seq_len(nrow(gpsSmall) - 1),
       function(i){
           splitPoints(gpsSmall[i,], gpsSmall[i+1,])
       })

然而,newPoints返回3的(数列gpsSmall)矩阵X 66(1 - 行中gpsSmall数)。我究竟做错了什么?

r apply sapply
1个回答
1
投票

不使用的应用功能,但这样的事情可能使它更容易一点。鉴于我觉得你的问题是,这应该这样做。我假设你想activity_no是一个分组机制。如果没有,那就更简单了。只要使用如下对整个数据集,而不是第一剖开它做的approx功能。

一对夫妇tidyverse包:

library(dplyr)
library(purrr)

加载数据片段:

dat <- tribble(
  ~activity_no, ~lat, ~lon,
  1,           52.5111, -1.85222,
  1,           52.5111, -1.86224,
  1,           52.5111, -1.87226,
  2,           52.6189, -1.85332,
  2,           52.6284, -1.86332,
  2,           52.6386, -1.87332
)

而现在使用?approx只是做线性插值。内插输出的长度设置为N * 2 - 1基本上说,有在每个实际观测之间1个新值。由于它是线性的,这将是平均值。你可以调整输出和插值获得了更高水平的,如果你想这样做。

dat %>%
  split(dat$activity_no) %>%
  map_dfr( ~ data.frame(activity_no = rep(.$activity_no[1], nrow(.) * 2 - 1),
                lat = approx(.$lat, n = nrow(.) * 2 - 1)$y,
                lon = approx(.$lon, n = nrow(.) * 2 - 1)$y))

   activity_no      lat      lon
1            1 52.51110 -1.85222
2            1 52.51110 -1.85723
3            1 52.51110 -1.86224
4            1 52.51110 -1.86725
5            1 52.51110 -1.87226
6            2 52.61890 -1.85332
7            2 52.62365 -1.85832
8            2 52.62840 -1.86332
9            2 52.63350 -1.86832
10           2 52.63860 -1.87332
© www.soinside.com 2019 - 2024. All rights reserved.