R中的距离计算优化

2024-04-09

我想知道是否有任何方法可以优化下面的距离计算过程。我在下面留下了一个小例子,但是我正在处理一个超过 6000 行的电子表格,计算变量 d 需要相当长的时间。可以通过某种方式调整它以获得相同的结果,但以优化的方式。

library(rdist)
library(tictoc)
library(geosphere)

time<-tic()

df<-structure(list(Industries=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19), Latitude = c(-23.8, -23.8, -23.9, -23.9, -23.9,  -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, 
+ + -23.9, -23.9, -23.9, -23.9, -23.9), Longitude = c(-49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.7, 
+ + -49.7, -49.7, -49.7, -49.7, -49.6, -49.6, -49.6, -49.6)), class = "data.frame", row.names = c(NA, -19L))

k=3 
#clusters
coordinates<-df[c("Latitude","Longitude")]
d<-as.dist(distm(coordinates[,2:1]))
fit.average<-hclust(d,method="average") 
clusters<-cutree(fit.average, k) 
nclusters<-matrix(table(clusters))  
df$cluster <- clusters 

time<-toc()

1.54 sec elapsed

d
          1        2        3        4        5        6        7        8
2      0.00                                                               
3  11075.61 11075.61                                                      
4  11075.61 11075.61     0.00                                             
5  11075.61 11075.61     0.00     0.00                                    
6  11075.61 11075.61     0.00     0.00     0.00                           
7  11075.61 11075.61     0.00     0.00     0.00     0.00                  
8  11075.61 11075.61     0.00     0.00     0.00     0.00     0.00         
9  11075.61 11075.61     0.00     0.00     0.00     0.00     0.00     0.00
10 11075.61 11075.61     0.00     0.00     0.00     0.00     0.00     0.00
11 15048.01 15048.01 10183.02 10183.02 10183.02 10183.02 10183.02 10183.02
12 15048.01 15048.01 10183.02 10183.02 10183.02 10183.02 10183.02 10183.02
13 15048.01 15048.01 10183.02 10183.02 10183.02 10183.02 10183.02 10183.02
14 15048.01 15048.01 10183.02 10183.02 10183.02 10183.02 10183.02 10183.02
15 15048.01 15048.01 10183.02 10183.02 10183.02 10183.02 10183.02 10183.02
16 11075.61 11075.61     0.00     0.00     0.00     0.00     0.00     0.00
17 11075.61 11075.61     0.00     0.00     0.00     0.00     0.00     0.00
18 11075.61 11075.61     0.00     0.00     0.00     0.00     0.00     0.00
19 11075.61 11075.61     0.00     0.00     0.00     0.00     0.00     0.00
          9       10       11       12       13       14       15       16
2                                                                         
3                                                                         
4                                                                         
5                                                                         
6                                                                         
7                                                                         
8                                                                         
9                                                                         
10     0.00                                                               
11 10183.02 10183.02                                                      
12 10183.02 10183.02     0.00                                             
13 10183.02 10183.02     0.00     0.00                                    
14 10183.02 10183.02     0.00     0.00     0.00                           
15 10183.02 10183.02     0.00     0.00     0.00     0.00                  
16     0.00     0.00 10183.02 10183.02 10183.02 10183.02 10183.02         
17     0.00     0.00 10183.02 10183.02 10183.02 10183.02 10183.02     0.00
18     0.00     0.00 10183.02 10183.02 10183.02 10183.02 10183.02     0.00
19     0.00     0.00 10183.02 10183.02 10183.02 10183.02 10183.02     0.00
         17       18
2                   
3                   
4                   
5                   
6                   
7                   
8                   
9                   
10                  
11                  
12                  
13                  
14                  
15                  
16                  
17                  
18     0.00         
19     0.00     0.00

比较

> df$cluster <- clusters 
> df
   Industries Latitude Longitude cluster
1           1    -23.8     -49.6       1
2           2    -23.8     -49.6       1
3           3    -23.9     -49.6       2
4           4    -23.9     -49.6       2
5           5    -23.9     -49.6       2
6           6    -23.9     -49.6       2
7           7    -23.9     -49.6       2
8           8    -23.9     -49.6       2
9           9    -23.9     -49.6       2
10         10    -23.9     -49.6       2
11         11    -23.9     -49.7       3
12         12    -23.9     -49.7       3
13         13    -23.9     -49.7       3
14         14    -23.9     -49.7       3
15         15    -23.9     -49.7       3
16         16    -23.9     -49.6       2
17         17    -23.9     -49.6       2
18         18    -23.9     -49.6       2
19         19    -23.9     -49.6       2

> clustered_df
   Industries Latitude Longitude cluster     Dist Cluster
1          11    -23.9     -49.7       3     0.00       1
2          12    -23.9     -49.7       3     0.00       1
3          13    -23.9     -49.7       3     0.00       1
4          14    -23.9     -49.7       3     0.00       1
5          15    -23.9     -49.7       3     0.00       1
6           3    -23.9     -49.6       2 10183.02       2
7           4    -23.9     -49.6       2     0.00       2
8           5    -23.9     -49.6       2     0.00       2
9           6    -23.9     -49.6       2     0.00       2
10          7    -23.9     -49.6       2     0.00       2
11          8    -23.9     -49.6       2     0.00       2
12          9    -23.9     -49.6       2     0.00       2
13         10    -23.9     -49.6       2     0.00       2
14         16    -23.9     -49.6       2     0.00       2
15         17    -23.9     -49.6       2     0.00       2
16         18    -23.9     -49.6       2     0.00       2
17         19    -23.9     -49.6       2     0.00       2
18          1    -23.8     -49.6       1 11075.61       3
19          2    -23.8     -49.6       1     0.00       3

@Jose也许在数学上不那么合理(就聚类而言),但(通常)更好地测量大圆距离(文森蒂公式)。并且实现速度提高了约 8 倍(我认为这是您想要的结果)-(仅使用您的示例数据)。

# Order the dataframe by Lon and Lat: ordered_df => data.frame
ordered_df <- 
  df %>% 
  arrange(., Longitude, Latitude)  

# Scalar valued at how many clusters we are expecting => integer vector
k = 3

# Matrix of co-ordinates: coordinates => matrix
coordinates <-   
  ordered_df %>% 
  select(Longitude, Latitude) %>% 
  as.matrix()

# Generate great circle distances between points and Long-Lat Matrix: d => data.frame
d <- data.frame(Dist = c(0, distVincentyEllipsoid(coordinates)))

# Segment the distances into groups: cluster => factor 
d$Cluster <- factor(cumsum(d$Dist > (quantile(d$Dist, 1/k))) + 1)

# Merge with base data: clustered_df => data.frame
clustered_df <- cbind(ordered_df, d)

库和示例数据:

library(geosphere)
library(dplyr)

df <- structure(list(Industries=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19), 
Latitude = c(-23.8, -23.8, -23.9, -23.9, -23.9,  -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9),
Longitude = c(-49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.7,-49.7, -49.7, -49.7, -49.7, -49.6, -49.6, -49.6, -49.6)),
class = "data.frame", row.names = c(NA, -19L))
start_time <- Sys.time()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R中的距离计算优化 的相关文章

  • 如何使用“downloadHandler”在闪亮的可反应内部创建下载按钮?

    我创建downloadlinksa 的行内reactable 我这样做是为了DT datatable and a reactable reactable 我还创建了相应的output downloadHandler在 ids 上使用 app
  • 使用 r 以周为单位对数据进行分组

    I have a CVS file which has data for different countries at different weeks of this year I want to create a summary data
  • 连接路径的函数?

    是否有现有的函数来连接路径 我知道实施起来并不困难 但仍然 除了照顾尾随 or 我需要注意正确的操作系统路径格式检测 即我们是否编写C dir file or dir file 正如我所说 我相信我知道如何实施它 问题是 我应该这样做吗 现
  • 获取数据集 R 包中所有对象名称的列表?

    如何获取对象中对象的确切名称列表datasets https stat ethz ch R manual R devel library datasets html 00Index html包裹 我在这里找到了很多 data package
  • 将 stat_smooth 添加到 ggplot2 中的仅 1 个方面

    我有一些数据 在某个因素的某个水平上 存在显着的相关性 在另一个层面上 则没有 并排绘制这些图很简单 使用 stat smooth 向它们添加一行 也很简单 但是 我不希望线条或其填充显示在两个面之一中 有没有一种简单的方法可以做到这一点
  • 如何通过在R闪亮循环中读取.csv文件来动态生成dataTableOutput?

    我有一个函数可以生成 n 个数据帧并将其作为 csv 文件保存在某个位置 并且该函数返回已保存 CSV 的文件名 我希望获取这些 csv 文件 使用以下命令读取它read csv 然后使用 renderUI 和 renderDataTabl
  • 如何在 Shiny 应用程序中访问/打印/跟踪当前选项卡选择?

    我正在一个闪亮的应用程序中工作 我希望能够访问用户在会话中当前所在选项卡上的信息 我有一个观察事件 用于侦听要单击的特定按钮 简而言之 我想存储 打印用户单击此按钮时所在的当前选项卡 单击此按钮后 选项卡将更改为带有 updateTabIt
  • ggplot2中的两列分组

    是否可以按两列分组 于是叉积就画出来了 经过geom point and geom smooth 例如 frame lt data frame series lt rep c a b 6 sample lt rep c glass wate
  • 正则表达式在 R 中同时多次包含字母/特殊字符时删除单词

    我想删除那些单词中字母 特殊字符的数量同时出现两次以上的单词 例如 输入就像 Google in theee lland of whhhat c c and e 输出应该是 Google in lland of c c and x lt G
  • R:适合显示具有倾斜计数的数据的图

    我有这样的数据 Name Count Object1 110 Object2 111 Object3 95 Object4 40 Object2000 1 因此 只有前 3 个物体的计数较高 其余 1996 个物体的数量少于 40 个 其中
  • ‘!’ 对于 R 中的因子没有意义

    我需要从数据框中排除变量 PABI 所以 我按如下方式进行子集化 MyData4 lt subset MyData PROV PABI newdata lt MyData MyData4 但我得到了这个错误 Error in FUN lef
  • 将一长行带空格的数据导入R中

    这个问题是我上一个问题的后续问题 将一长行数据导入到 R 中 https stackoverflow com questions 8389913 我有一个由单行文本组成的大型数据文件 格式类似于 Cat 14 15 Horse 16 我最终
  • 如何使用 Rcpp 将 C 结构从 C 库公开到 R

    我正在尝试将 C 结构从 C 库公开到 R 中 例如 struct A int flag 库提供 API 来构造和销毁是很常见的A A initA void freeA A a 感谢RCPP MODULE 很容易暴露它而不考虑析构函数 in
  • 如何在 R 中创建“堆叠瀑布”图表?

    I was able to find several packages to create a waterfall chart in R which look like this But I could not find a way to
  • 计算数据集列的百分位数

    最亲爱的 R 专家 为您快速介绍一下 我正在做一项作业 在这个练习中 我被要求从数据中获取基本统计数据infert数据集 它是内置的 特别是其中的一列 infert age 对于不熟悉数据集的人 gt table ages Which is
  • 从 r 中的多个列表创建二进制(存在/不存在)数据矩阵

    我有一系列不同长度的单独变量列表 字符串 我想将它们组合成一个数据帧以形成存在 1 不存在 0 矩阵 鉴于它们的长度不同 我什至不知道如何创建初始数据框 这是我的例子 data1 lt c a b c d e f data2 lt c e
  • mtext:使用布局时较小的标签描述

    使用 mtext 作为标签描述与使用 xlab 的作用不同 如何使 mtext 标签始终与使用 xlab 时的大小相同 无需始终定义 cex 参数 在下面的最小示例中 两个图的 cex cex lab 1 不过大小不同 layout mat
  • 按值对 geom_bar ggplot2 中的条形重新排序

    我正在尝试制作一个条形图 其中的图是从miRNA与最高的value to the miRNA与最低的 为什么我的代码不起作用 gt head corr m miRNA variable value 1 mmu miR 532 3p pos
  • 将时间值转换为数字,同时保留时间特征

    我有一个数据集 其中包含不同事件发生的间隔时间 我想要做的是将数据转换为数字向量 以便更容易操作和运行摘要 制作图表等 同时保持其时间特征 这是我的数据片段 data lt c 03 31 12 17 16 29 09 52 04 01 0
  • R 连接到主机时出错

    我已经安装了 R 3 0 2 和包KEGGREST 在使用它的命令时 我收到以下错误 函数错误 类型 消息 asError TRUE 无法连接到 主持人 使用 internet2 选项后 我可以很好地从互联网安装软件包 该选项使用来自 In

随机推荐

  • 列表活动中的上下文菜单

    我有带有自定义数组适配器的列表活动 当长按列表项时我无法获取上下文菜单
  • 如何使用 vue-cli 3 创建两个单独的包?

    我想构建两个独立的 vue 应用程序 它们将在 Express 应用程序中的两条不同路径上提供服务 公共 vue 应用程序和 管理 vue 应用程序 这两个应用程序有自己的路由器和商店 但它们共享许多自定义组件 如何编辑默认的 webpac
  • Distcp 源长度不匹配

    我在执行时遇到问题distcp两个不同的命令之间hadoop簇 引起原因 java io IOException 长度不匹配 来源 hdfs ip1 xxxxxxxxxxx xxxxx 和 目标 hdfs nameservice1 xxxx
  • Rails 使用 puma,将 localhost:3000 更改为 localhost:3000/example

    我开发了一个 Rails 5 应用程序 可以很好地运行http 本地主机 3000 http localhost 3000 现在 我需要该应用程序在 localhost 3000 example 中启动 并且该链接通过这个新主机 例如 lo
  • 源 bashrc 在 cron 中不起作用

    我们都知道 cron 会忽略 bashrc 和 bash profile 中定义的变量 因此我们必须在 cron 中定义它 我经常做类似问题中写的同样的事情https unix stackexchange com questions 679
  • 如何替换数据帧每行中大于某个阈值的前 n 个元素

    我有一个巨大的数据框 仅包含数字 下面显示的数据框仅用于演示目的 我的目标是替换数据帧的每一行中的第一行n大于某个值的数字val by 0 举个例子 我的数据框可能如下所示 c1 c2 c3 c4 0 38 10 1 8 1 44 12 1
  • 使用 GraphViz 理解 -fdump-tree 输出 gcc

    我创建了一个树转储 如下所述 如何将 gcc 生成的抽象语法树转储到 dot 文件中 https stackoverflow com questions 15800230 how can i dump an abstract syntax
  • Django:按日期范围过滤对象

    我的对象模型是 class Event models Model start models DateTimeField end models DateTimeField 我需要过滤今天的所有对象 我有一个对象 开始日期为 2014 03 0
  • Haskell抽象语法表达式的动态加载

    我们可以使用 GHC API 或其他东西来加载 AST 表达式而不是文本源模块 类似于haskell src extsExp type http hackage haskell org packages archive haskell sr
  • Scala 2.10.0 RC2 和可选参数

    我正在尝试Scala 宏 http scalamacros org 它们是 Scala 2 10 的一部分 但当我尝试编译 使用 sbt 时 出现以下错误 error API scala 9 not enough arguments for
  • Javascript 原型与通用函数 - 性能/可读性

    所以我编写了这些测试来看看使用原型会快多少 function User return name Dave setName function n this name n getName function return this name fu
  • 通过引用传递数组与传递指针的函数参数绑定规则

    为了防止任何混淆 我非常了解数组和指针之间的区别 衰减到指针的概念以及通过传递数组的概念参考在C 等中 我的问题是具体来说关于编译器从一组函数中选择一个函数所使用的规则overload候选者 当一个重载采用数组引用 而另一个重载采用指针时
  • 同一数据库中的实体框架核心多个 DbContext 迁移

    在 Entity Framework 6 中 您可以为 DbContext 指定 ContextKey 以便在将一个数据库用于多个 DbContext 时 迁移表知道哪个迁移针对哪个 DbContext 在过去的几个小时里 我一直在尝试弄清
  • 适用于 Linux 的 NUMA 感知命名共享内存

    Windows API 提供了 CreateFileMappingNuma 函数 http msdn microsoft com en us library windows desktop aa366539 v vs 85 aspx htt
  • Ruby win32ole - 如何传递 VARIANT 参数?

    我正在尝试使用 Ruby 自动化 Windows 任务计划程序 我在 Windows Vista 下使用 Ruby 1 8 TaskFolder 对象的 RegisterTaskDefintion 方法采用两个 VARIANT 参数作为用户
  • Git 推送到错误的分支

    使用 git 进行一些 提交 和几次 推送 之后 我意识到我使用了错误的分支 现在我必须以某种方式删除我的更改wrong branch并提交并推送更改right branch 最好的 而且简单的 方法是什么 切换到该分支 检查git log
  • “LazyCorpusLoader”对象不可迭代

    以下示例创建一个字谜词典 然而 它抛出一个TypeError LazyCorpusLoader object is not an iterator import nltk from nltk corpus import words anag
  • 使用 jQuery 将单个事件处理程序绑定到多个事件

    我有以下 div 具有不同的 onblur onmousedown onmouseup 和 onfocus 功能 我想最小化代码 并且在 div 内只有一个函数调用来处理所有函数状态 我想用 jquery 来做到这一点 所以换句话说 我想创
  • 用 Python 表示网络

    我有一个顶点 例如dic a 0 b 1 c 2 d 3 e 4 f 5 n 6 m 7 g 8 我有两列如下代表顶点之间的关系 a a b d e f c f n f m g 我想通过一条边将第一列中的每个顶点与第二列中的相应顶点关联起来
  • R中的距离计算优化

    我想知道是否有任何方法可以优化下面的距离计算过程 我在下面留下了一个小例子 但是我正在处理一个超过 6000 行的电子表格 计算变量 d 需要相当长的时间 可以通过某种方式调整它以获得相同的结果 但以优化的方式 library rdist