- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想计算每个省许多房屋之间的平均地理距离。
假设我有以下数据。
df1 <- data.frame(province = c(1, 1, 1, 2, 2, 2),
house = c(1, 2, 3, 4, 5, 6),
lat = c(-76.6, -76.5, -76.4, -75.4, -80.9, -85.7),
lon = c(39.2, 39.1, 39.3, 60.8, 53.3, 40.2))
geosphere
图书馆我可以找到两所房子之间的距离。例如:
library(geosphere)
distm(c(df1$lon[1], df1$lat[1]), c(df1$lon[2], df1$lat[2]), fun = distHaversine)
#11429.1
最佳答案
我最初的想法是查看 distHaversine
的源代码并将其复制到我将与 proxy
一起使用的函数中.
这会像这样工作(注意 lon
预计是第一列):
library(geosphere)
library(dplyr)
library(proxy)
df1 <- data.frame(province = as.integer(c(1, 1, 1, 2, 2, 2)),
house = as.integer(c(1, 2, 3, 4, 5, 6)),
lat = c(-76.6, -76.5, -76.4, -75.4, -80.9, -85.7),
lon = c(39.2, 39.1, 39.3, 60.8, 53.3, 40.2))
custom_haversine <- function(x, y) {
toRad <- pi / 180
diff <- (y - x) * toRad
dLon <- diff[1L]
dLat <- diff[2L]
a <- sin(dLat / 2) ^ 2 + cos(x[2L] * toRad) * cos(y[2L] * toRad) * sin(dLon / 2) ^ 2
a <- min(a, 1)
# return
2 * atan2(sqrt(a), sqrt(1 - a)) * 6378137
}
pr_DB$set_entry(FUN=custom_haversine, names="haversine", loop=TRUE, distance=TRUE)
average_dist <- df1 %>%
select(-house) %>%
group_by(province) %>%
group_map(~ data.frame(avg=mean(proxy::dist(.x[ , c("lon", "lat")], method="haversine"))))
proxy
可能无法分配中间(下三角)矩阵。
s2d
助手远非最佳,
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::depends(RcppParallel,RcppThread)]]
#include <cstddef> // size_t
#include <math.h> // sin, cos, sqrt, atan2, pow
#include <vector>
#include <RcppThread.h>
#include <Rcpp.h>
#include <RcppParallel.h>
using namespace std;
using namespace Rcpp;
using namespace RcppParallel;
// single to double indices for lower triangular of matrices without diagonal
void s2d(const size_t id, const size_t nrow, size_t& i, size_t& j) {
j = nrow - 2 - static_cast<size_t>(sqrt(-8 * id + 4 * nrow * (nrow - 1) - 7) / 2 - 0.5);
i = id + j + 1 - nrow * (nrow - 1) / 2 + (nrow - j) * ((nrow - j) - 1) / 2;
}
class HaversineCalculator : public Worker
{
public:
HaversineCalculator(const NumericVector& lon,
const NumericVector& lat,
double& avg,
const int n)
: lon_(lon)
, lat_(lat)
, avg_(avg)
, n_(n)
, cos_lat_(lon.length())
{
// terms for distance calculation
for (size_t i = 0; i < cos_lat_.size(); i++) {
cos_lat_[i] = cos(lat_[i] * 3.1415926535897 / 180);
}
}
void operator()(size_t begin, size_t end) {
// for Kahan summation
double sum = 0;
double c = 0;
double to_rad = 3.1415926535897 / 180;
size_t i, j;
for (size_t ind = begin; ind < end; ind++) {
if (RcppThread::isInterrupted(ind % static_cast<int>(1e5) == 0)) return;
s2d(ind, lon_.length(), i, j);
// haversine distance
double d_lon = (lon_[j] - lon_[i]) * to_rad;
double d_lat = (lat_[j] - lat_[i]) * to_rad;
double d_hav = pow(sin(d_lat / 2), 2) + cos_lat_[i] * cos_lat_[j] * pow(sin(d_lon / 2), 2);
if (d_hav > 1) d_hav = 1;
d_hav = 2 * atan2(sqrt(d_hav), sqrt(1 - d_hav)) * 6378137;
// the average part
d_hav /= n_;
// Kahan sum step
double y = d_hav - c;
double t = sum + y;
c = (t - sum) - y;
sum = t;
}
mutex_.lock();
avg_ += sum;
mutex_.unlock();
}
private:
const RVector<double> lon_;
const RVector<double> lat_;
double& avg_;
const int n_;
tthread::mutex mutex_;
vector<double> cos_lat_;
};
// [[Rcpp::export]]
double avg_haversine(const DataFrame& input, const int nthreads) {
NumericVector lon = input["lon"];
NumericVector lat = input["lat"];
double avg = 0;
int size = lon.length() * (lon.length() - 1) / 2;
HaversineCalculator hc(lon, lat, avg, size);
int grain = size / nthreads / 10;
RcppParallel::parallelFor(0, size, hc, grain);
RcppThread::checkUserInterrupt();
return avg;
}
haversine.cpp
,
library(dplyr)
library(Rcpp)
library(RcppParallel)
library(RcppThread)
sourceCpp("haversine.cpp")
df1 %>%
group_by(province) %>%
group_map(~ data.frame(avg=avg_haversine(.x, parallel::detectCores())))
# A tibble: 2 x 2
# Groups: province [2]
province avg
<int> <dbl>
1 1 15379.
2 2 793612.
pr_DB$set_entry(FUN=geosphere::distHaversine, names="distHaversine", loop=TRUE, distance=TRUE)
df1 %>%
select(-house) %>%
group_by(province) %>%
group_map(~ data.frame(avg=mean(proxy::dist(.x[ , c("lon", "lat")], method="distHaversine"))))
df <- data.frame(lon=runif(1e3, -90, 90), lat=runif(1e3, -90, 90))
system.time(proxy::dist(df, method="distHaversine"))
user system elapsed
34.353 0.005 34.394
system.time(proxy::dist(df, method="haversine"))
user system elapsed
0.789 0.020 0.809
system.time(avg_haversine(df, 4L))
user system elapsed
0.054 0.000 0.014
df <- data.frame(lon=runif(1e5, -90, 90), lat=runif(1e5, -90, 90))
system.time(avg_haversine(df, 4L))
user system elapsed
73.861 0.238 19.670
RcppParallel
创建的线程内无法检测到用户中断。 ,
int size = lon.length() * (lon.length() - 1) / 2;
n
倍,
n^2 / 2
倍, 大致说来。
N
的平均值数字而不先实际计算每个数字,
关于r - 按组划分的地理距离 - 在每对行上应用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55621827/
我在理解指针时遇到一些问题 我有矩阵,然后我使用它将其分成小块 tiles_num = n /tile; // Allocate blocked matrix Ah = (REAL **) mall
我有一个制表符分隔的文件,看起来像这样: foo 0 4 boo 3 2 blah 4 0 flah 1 1 我正在尝试计算每行两列之间的 log2。我的问题是除以零 我试过的是这样的: cat fi
在返回最终结果之前,我使用 BigDecimal 进行了几次计算。我的计算包含两个部分。我知道我应该在调用 divide() 时定义缩放和舍入模式。但是,由于我使用的是货币,所以我想尽可能长时间地保持
我正在尝试将两个数字 50 和 5 相除。这是我的代码: function Divide(Num1, Num2: Integer): Integer; asm MOV EAX, Num1
我对 R 和映射非常陌生,我想创建某些数据的映射。我有一组名为“D.Montreal”的数据,它显示了 2010 年访问蒙特利尔的加拿大人口普查部门的访客。我想使用这些数据创建一张 map ,以显示有
我需要制作一个条形图,将数据分为多个 bin。 我的数据如下所示: 1.0 5 1.2 4 2.4 1 4.3 6 5.2 10 然后在X轴上我想有时间的值,比如:[1-4)、[4-5)等(取决于cs
我正在尝试使用一个后台 worker ,它为字典中的每个键将内容保存到文件中。 ACon 是一个个人类,它在其中调用字典内容的保存函数。 private void bwSaver_DoWork(
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
我想将一些矩阵加载到我的程序中,然后我想将它分成更小的 block 。我想要的确切内容可以在下面的图片中看到: http://postimg.org/image/aki19hjx9/ba463111/
我有一个 anchor ,我将其注入(inject)到 jqGrid 格式化程序中的 HTML 中,如下所示: var number = rowObject.number; var plateNumb
我在传单标记上使用弹出窗口,并使用背景作为固定大小的图像。每当标记放置在 map 的一 Angular ,然后我单击标记以显示弹出窗口时,它会稍微移动整个 map 几分之一秒,然后弹出消息会超出 ma
我有一些代码,例如: good = [x for x in mylist if x in goodvals] bad = [x for x in mylist if x not in goodvals
我想将我的窗口 (wpf) 分成三列:左列必须是 DockPanel(我认为 StackPanel 在 Canvas), 右栏应该是另一个 DockPanel 包含一个 listbox 并且在中间我需
我有按国家/地区划分城市列表的代码: query('SELECT `city`, `country` FROM `cities` ORDER BY `id` ASC'); $cities->execu
我已经划分了我的Bootstrap网格列如下。 A B1 B1.1
我正在开发一个 asp.net 项目,但我还没有很长的 web.config 文件(超过 400 行)。但是有了这个 nhibernate log4net 和 urlrewrites。它越来越大。有没
我正在尝试使用 NSArrayController 和 cocoa 绑定(bind)创建分段的 NSTableView。我正在寻找类似的方法,例如 iOS 中的 NSFetchedResultsCon
早上好,下午好,还是晚上好, 在查看关闭“抑制 JIT 优化 (...)”选项的调试构建的汇编代码后,我注意到以下奇怪的行为(bitCount 是 ulong): int BitQ
我正在尝试根据 Firebase 数据库中的键对 Tableview 数据进行分段。 我能够根据键 (itemPreset) 正确划分所有内容。 我在将可重用单元分配到其部分时遇到问题。 单元格不断重
我最近升级到 Lodash 3.10.1我注意到了一些奇怪的事情。 假设我有一个数字数组,我想得到数组中的最大值然后减半: var series = [ 6, 8, 2 ]; var highestT
我是一名优秀的程序员,十分优秀!