首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中矢量化坐标计算的for循环?

如何在R中矢量化坐标计算的for循环?
EN

Stack Overflow用户
提问于 2021-01-26 23:46:53
回答 2查看 48关注 0票数 2

我正在尝试查看中每个 center点中有多少个center,但这是目前在for循环中完成的。如果可以矢量化的话会有可能吗?下面是一个可以复制的片段。谢谢。

代码语言:javascript
复制
require(geosphere)

centers <- as.data.frame(matrix(rnorm(10, mean = 40, sd = .5), ncol = 2, byrow = TRUE))
points <- matrix(rnorm(100, mean = 40, sd = 1), ncol = 2, byrow = TRUE)

for(i in 1:dim(centers)[1]){
  # Calculate number of points that are 50 km within every center point
  centers[i,3] <- sum(geosphere::distHaversine(points, 
                                               centers[i,c(1:2)]) /
                        1000 < 50, na.rm = TRUE)
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-27 05:22:56

您可以将splitrowsapply一起使用,然后再使用colSums

代码语言:javascript
复制
library(geosphere)
centers$res <- colSums(
  sapply(split(as.matrix(centers[, 1:2]), row(centers)[, 1:2]), 
         distHaversine, p1 = points) / 1000 < 50, na.rm = TRUE)

它给出了同样的结论:

代码语言:javascript
复制
# compute the old result to compare with
for(i in 1:dim(centers)[1])
  centers[i,4] <- sum(geosphere::distHaversine(points, 
                                               centers[i,c(1:2)]) /
                        1000 < 50, na.rm = TRUE)

# gives the same
all.equal(centers$res, centers[, 4])
#R> [1] TRUE

另一种可能的选择是:

代码语言:javascript
复制
dists <- tapply(as.matrix(centers[, 1:2]), row(centers[, 1:2]), 
                distHaversine, p1 = points)
centers$res <- colSums(simplify2array(dists) / 1000 < 50, na.rm = TRUE)

或者使用匿名函数。这就像Ronak Shah的答案,但是有了tapply

代码语言:javascript
复制
centers$res <- c(tapply(
  as.matrix(centers[, 1:2]), row(centers[, 1:2]), function(x)
    sum(distHaversine(points, x) / 1000 < 50, na.rm = TRUE)))
票数 1
EN

Stack Overflow用户

发布于 2021-01-27 03:24:25

如果函数一次只能处理一个点,我不认为它能够真正地向量化。您可以将for循环替换为sapply,并查看性能是否有任何改善。

代码语言:javascript
复制
library(geosphere)

centers$total <- sapply(seq(nrow(centers)), function(i) {
      sum(distHaversine(points, centers[i,]) /1000 < 50, na.rm = TRUE)
})  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65910935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档