【问题标题】:R: Inserting Mid Values of Data Frame Row PairsR:插入数据帧行对的中间值
【发布时间】:2019-02-10 18:21:03
【问题描述】:

我有一系列来自 Strava 的坐标,每 2.5 分钟记录一次,然后将这些坐标添加到 QGIS 地图中。我想通过取每对纬度和经度的平均值来插入中间的点。

我知道我可以使用 for 循环,但我更愿意使用 apply 系列函数中的一个。我知道我需要获取当前行,然后获取除最后一行之外的所有内容的下一行。

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 中的行数)的矩阵。我做错了什么?

【问题讨论】:

  • 能否请您更新您的问题,以使您的输入复制/粘贴以及该输入所需的输出清晰?我认为expand.gridmergeapprox 的某种组合将使这变得非常容易,但我无法确定,而且您呈现输入数据的方式使其难以测试。与dput 共享的数据或共享代码以创建示例数据是最好的。

标签: r apply sapply


【解决方案1】:

不使用 apply 函数,但这样的事情可能会更容易一些。鉴于我认为您的问题是,应该这样做。我假设您希望 activity_no 成为一种分组机制。如果没有,那就更容易了。只需在整个数据集上使用下面的approx 函数,而不是先拆分它。

几个tidyverse 包:

library(dplyr)
library(purrr)

加载您的数据 sn-p:

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

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多