0

我有一个大矩阵,用于计算两个不同邮政编码之间的距离(使用rgeosphere包)。我想运行一个函数来查找彼此之间 <=x 距离的所有邮政编码配对并创建它们的列表。数据如下所示:

       91423  92231  94321
 90034  3     4.5    2.25
 93201  3.75  2.5    1.5
 94501  2     6      0.5

因此,如果我运行该函数来提取所有 <2 英里以外的邮政编码配对,我最终会得到这些邮政编码:

94321
94321
93201
94501

目标基本上是将美国所有相邻的邮政编码识别为我拥有的邮政编码列表。如果有更好的方法可以做到这一点,我愿意接受建议。

4

3 回答 3

1

也许像下面这样。它会很慢,但它应该可以工作。

for(i in 1:nrow(data)){
    for (j in 1:ncol(data)){
        if(data[i,j]<distance){
            if(exists(hold.zips)==FALSE){
                hold.zips<-matrix(c(colnames(data)[i],colnames(data)[j]),ncol=2)
            }else{
                temp<-matrix(c(colnames(data)[i],colnames(data)[j]),ncol=2)
                hold.zips<-rbind(hold.zips,temp)
            }
        }
    }
}
于 2017-12-29T20:44:21.660 回答
1

这应该有效。给出一个不错list的输出(调用你的数据x):

rn = rownames(x)
apply(x, 2, function(z) rn[z < 2])
# $`91423`
# character(0)
# 
# $`92231`
# character(0)
# 
# $`94321`
# [1] "93201" "94501"
于 2017-12-29T20:51:41.217 回答
0

这是 Tidyverse 解决方案:

library(dplyr)
library(tidyr)

# your data
dat <- matrix(c(3,3.75,2,4.5,2.5,6,2.25,1.5,0.5), nrow = 3, ncol = 3)
rownames(dat) <- c(90034, 93201, 94501)
colnames(dat) <- c(91423, 92231, 94321)

# tidyverse solution
r <- rownames(dat)
dat_tidy <- dat %>%
  as_tibble() %>%
  mutate(x = r) %>%
  select(x, everything()) %>%
  gather(key = y,
         value = distance,
         -x) %>%
  filter(distance < 2)

print(dat_tidy)

# note if your matrix is a symetric matrix then
# to remove duplicates, filter would be:
# filter(x < y,
#        distance < 2)
于 2017-12-30T14:22:48.287 回答