我有一系列的记录每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数)。我究竟做错了什么?
不使用的应用功能,但这样的事情可能使它更容易一点。鉴于我觉得你的问题是,这应该这样做。我假设你想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