R - 根据位置将纬度/经度点的巨大数据帧分组

2024-03-03

我是 R 新手,但我听说使用它确实是一个坏主意for循环。我有使用它们的工作代码,但我想改进它,因为它对于大数据来说非常慢。我已经有了一些如何改进算法的想法,但我不知道如何对其进行矢量化,或者在没有for loops.

我只是将纬度/经度点分组为一个以半径为参数的圆。

该函数的示例输出(仅填充circle_id列中的值),半径设置为100米:

[1] "Locations: "
   latitude  longitude sensor_time sensor_time2         circle_id
   48.15144  17.07569  1447149703  2015-11-10 11:01:43         1
   48.15404  17.07452  1447149743  2015-11-10 11:02:23         2
   48.15277  17.07514  1447149762  2015-11-10 11:02:42         3
   48.15208  17.07538  1447149771  2015-11-10 11:02:51         1
   48.15461  17.07560  1447149773  2015-11-10 11:02:53         4
   48.15139  17.07562  1447149811  2015-11-10 11:03:31         1
   48.15446  17.07517  1447149866  2015-11-10 11:04:26         2
   48.15266  17.07330  1447149993  2015-11-10 11:06:33         5

所以我有2个for循环,loop1遍历每一行,loop2遍历之前的每个circle_id并检查loop1的当前位置是否在loop2现有圆的半径内。每个circle_id 的中心是在所有前一个半径之外找到的第一个位置。

这是代码:

init_circles = function(datfr, radius) {
  cnt = 1
  datfr$circle_id[1] = 1
  longitude = datfr$longitude[1]
  latitude = datfr$latitude[1]
  circle_id = datfr$circle_id[1]
  datfr2 <- data.frame(longitude, latitude, circle_id)

  for (i in 2:NROW(datfr)) {
      for (j in 1:NROW(datfr2)) {
        tmp = distHaversine(c(datfr$longitude[i],datfr$latitude[i]) ,c(datfr2$longitude[j],datfr2$latitude[j]))
        if (tmp < radius){
          datfr$circle_id[i] = datfr2$circle_id[j]
          break
        }
      }
      if (datfr$circle_id[i]<1){
        cnt = cnt +1
        datfr$circle_id[i] = cnt
        datfr2[nrow(datfr2)+1,] = c(datfr$longitude[i],datfr$latitude[i],datfr$circle_id[i])
      }
  }
  return(datfr)
}

datfr是没有设置circle_id的输入数据框,并且datfr2是一个包含已经存在的圆圈的临时数据框。

EDIT: here is a visual output:
enter image description here

您可以看到这些圆圈的用途,上面的红色圆圈还有 21 个其他位置适合其半径(21 + 1 原始 = 22)

非常感谢您的帮助, 阿莱娜


我假设我们有一个数据框circles每个圆的中心和半径,并且问题中发布的示例数据位于名为的数据框中dat。下面的代码向量化距离的计算并使用lapply计算每个点到每个圆中心的距离,并确定每个点是否在该圆的半径内。

library(geosphere)

# We'll check the distance of each data point from the center of each 
#  of these circles
circles = data.frame(ID=1:2, lon=c(17.074, 17.076), lat=c(48.1513, 48.15142), 
                     radius=c(180,190))

datNew = lapply(1:nrow(circles), function(i) {

  df = dat

  df$dist = distHaversine(df[,c("longitude", "latitude")], 
                          circles[rep(i,nrow(df)), c('lon','lat')])

  df$in_circle = ifelse(df$dist <= circles[i, "radius"], "Yes", "No")

  df$circle_id = circles[i, "ID"]

  df

})

datNew = do.call(rbind, datNew)

datNew
   latitude longitude sensor_time sensor_time2    time3      dist in_circle circle_id
1  48.15144  17.07569  1447149703   2015-11-10 11:01:43 126.47756       Yes         1
2  48.15404  17.07452  1447149743   2015-11-10 11:02:23 307.45048        No         1
3  48.15277  17.07514  1447149762   2015-11-10 11:02:42 184.24465        No         1
4  48.15208  17.07538  1447149771   2015-11-10 11:02:51 134.32601       Yes         1
5  48.15461  17.07560  1447149773   2015-11-10 11:02:53 387.15358        No         1
6  48.15139  17.07562  1447149811   2015-11-10 11:03:31 120.73138       Yes         1
7  48.15446  17.07517  1447149866   2015-11-10 11:04:26 362.34236        No         1
8  48.15266  17.07330  1447149993   2015-11-10 11:06:33 160.07179       Yes         1
9  48.15144  17.07569  1447149703   2015-11-10 11:01:43  23.13059       Yes         2
10 48.15404  17.07452  1447149743   2015-11-10 11:02:23 311.68096        No         2
11 48.15277  17.07514  1447149762   2015-11-10 11:02:42 163.29068       Yes         2
12 48.15208  17.07538  1447149771   2015-11-10 11:02:51  86.70762       Yes         2
13 48.15461  17.07560  1447149773   2015-11-10 11:02:53 356.34955        No         2
14 48.15139  17.07562  1447149811   2015-11-10 11:03:31  28.41890       Yes         2
15 48.15446  17.07517  1447149866   2015-11-10 11:04:26 343.97933        No         2
16 48.15266  17.07330  1447149993   2015-11-10 11:06:33 243.44024        No         2

现在我们有一个数据框告诉我们每个点是否在给定的圆内。数据帧是长格式,这意味着有n原始数据框中每个点的行dat, where n是行数circles数据框。从这里,您可以进行进一步的处理,例如为多个圆圈中的每个点保留一行,等等。

这是一个例子。我们将返回一个数据框,列出点所在的圆,或者如果该点不在任何圆内,则返回“None”:

library(dplyr)

datNew %>%
  group_by(latitude, longitude) %>% 
  summarise(in_which_circles = if(any(in_circle=="Yes")) paste(circle_id[in_circle=="Yes"], collapse=",") else "None")
  latitude longitude in_which_circles
     <dbl>     <dbl>            <chr>
1 48.15139  17.07562              1,2
2 48.15144  17.07569              1,2
3 48.15208  17.07538              1,2
4 48.15266  17.07330                1
5 48.15277  17.07514                2
6 48.15404  17.07452             None
7 48.15446  17.07517             None
8 48.15461  17.07560             None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R - 根据位置将纬度/经度点的巨大数据帧分组 的相关文章

  • 在ggplotly散点图中添加自定义数据标签

    我想显示Species对于每个数据点 当光标位于该点上方而不是 x 和 y 值时 我用iris数据集 另外 我希望能够单击数据点以使标签持久存在 并且当我在图中选择新位置时标签不会消失 如果可能的话 最基本的是标签 持久性问题是一个优点 这
  • 栅格堆叠后如何写入?

    我想操作几个光栅文件 然后再次写入它们 rasterfiles lt list files C data envi full names TRUE d1 lt overlay stack rasterfiles fun function x
  • 对于多项式,获取其所有极值并通过突出显示所有单调部分来绘制它

    有人问我这个有趣的问题 我认为值得将其发布在这里 因为 Stack Overflow 上还没有任何相关线程 假设我有长度为的多项式系数n vector pc 其中次数多项式n 1对于变量x可以以其原始形式表示 pc 1 pc 2 x pc
  • 将天气 iframe 嵌入到 Shiny Dashboard 中

    我正在尝试将 Forecast io 的天气预报嵌入到闪亮的仪表板中 我最初在使用 符号时遇到了麻烦 但看到一篇文章提供了如何使用特殊字符格式化 HTML 代码的示例 但是 当我运行该应用程序时 我看到一个简单的 未找到 即使我知道该链接有
  • 使用starts_with() 将 NA 替换为 0

    我正在尝试替换我的一组特定列的 NA 值tibble 这些列都以相同的前缀开头 所以我想知道是否有一种简洁的方法来使用starts with 函数从dplyr包可以让我做到这一点 我已经看到了有关 SO 的其他几个问题 但是它们都需要使用特
  • 连接多个用户的 R 闪亮会话

    最小可重现示例 library shiny ui lt fluidPage actionButton button1 Run 1 actionButton button2 Run 2 server lt function session i
  • 如何在 R 中只为直方图的一个标签着色?

    我有一个像这样的数据框 CellLines ZEB1 600MPE 2 8186 AU565 2 783 BT20 2 7817 BT474 2 6433 BT483 2 4994 BT549 3 035 CAMA1 2 718 DU447
  • 访问 R 工作区中的数据[重复]

    这个问题在这里已经有答案了 我是自学 R 的 可能有一些非常基本的东西我可能不熟悉 如果是这样我道歉 我正在尝试访问外部来源提供给我的数据 它作为一个工作空间出现 我的流程如下 gt ls 1 2003OHT HR gt attach 20
  • 在 Shiny 中叠加两个 ggplot

    我有一个非常大的数据集 我正在使用 ggplot 在 Shiny 上绘制它 我有一个与 x 轴上的值相关联的滑块 我想用它对选定的数据子集重新着色 并让其余数据保持原样 最简单的选择是重新创建整个绘图 但由于它是一个大型数据集 因此这是一个
  • 使用 readHTMLTable 从 https 网页读取表格

    我安装了 R 3 3 1 并使用 RStudio 0 99 903 我正在尝试从以下 URL 将表格读入 R https www fantasypros com nfl rankings consensus cheatsheets php
  • 将日期时间字符串转换为 Date 类

    我有一个带有日期时间字符列的数据框 当我使用as Date 除了少数实例之外 我的大多数字符串都被正确解析 下面的示例有望向您展示发生了什么 my attempt to parse the string to Date uses the s
  • R:如何找到向量的模式[重复]

    这个问题在这里已经有答案了 下面是我的data frame我想知道每个内存类别 1 到 8 的模式是什么 gt dput d structure list MEMORY1 c 5 5 7 1 5 6 4 5 4 5 5 4 1 5 5 2
  • 从 data.frame 中提取时用 NA 填充缺失的列

    我有一个函数 它将具有某些列的数据框作为输入 columns a b z 现在我有一个数据框DF只有很少的这些列DF columns f u z 如果列不在其中 如何创建一个包含所有值为 NA 的列的数据框DF这与DF在柱子上 f u z
  • R闪亮:使用闪亮的JS从数据表中获取信息

    我想读出所有列名称以及它们在数据表中显示的顺序 由于不同的原因 我无法使用 stateSave 等选项 我对 JS 没有什么把握 但我确信用它可以完成 所以我需要你帮助我 我尝试过类似的代码片段 datatable data callbac
  • 根据 R 数据框中的名称对列进行平均

    我想知道是否有一种有效的方法来获取每组的平均值类似命名的列谁的名字结尾为 1S and 2S ex ex1S ex2S at time 1并取每组的平均值类似命名的列谁的名字结尾为 1C or 2C ex ex1C ex2C at time
  • 如何读取 R 中的每个 .csv 文件并将其导出到单个大文件中

    你好 我有以下格式的数据 101 20130826T155649 3 1 round 0 10552 180 yellow 12002 1 round 1 19502 150 yellow 22452 1 round 2 28957 130
  • 如何总结此R问题中的销售数量、售出酒类数量和花费金额

    我使用以下代码在 R 上上传我的数据 if file exists ames liquor rds url lt https github com ds202 at ISU materials blob master 03 tidyvers
  • dplyr 中的标准评估:全局环境中的函数出现“无法找到函数”错误

    我试图在 dplyr 中对全局环境中的函数使用标准评估 但出现 无法找到函数 错误 这是一些代码 create data frame df lt data frame x rnorm 10 y rnorm 10 define arbitra
  • 通过 r markdown 中的循环创建代码片段

    如同如何使用R中的knitr创建一个包含代码块和文本的循环 https stackoverflow com questions 36373630 how to create a loop that includes both a code
  • R data.table fwrite 到 fread 空间分隔符并清空

    我在使用 fread 以 作为分隔符和散布的空白值时遇到问题 例如 这个 dt lt data table 1 5 1 5 1 5 make a simple table dt 3 V2 NA add a blank in the midd

随机推荐