从 R 中的矩阵值创建观察列表
Creating List of Observations from Matrix Values in R
我有一个大矩阵,用于计算两个不同邮政编码之间的距离(使用 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
目标基本上是将美国所有相邻的邮政编码识别到我拥有的邮政编码列表中。如果有更好的方法,我愿意接受建议。
也许像下面这样。它会很慢,但它应该工作。
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)
}
}
}
}
这应该有效。给出一个很好的 list
作为输出(调用你的数据 x
):
rn = rownames(x)
apply(x, 2, function(z) rn[z < 2])
# $`91423`
# character(0)
#
# $`92231`
# character(0)
#
# $`94321`
# [1] "93201" "94501"
这是 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)
我有一个大矩阵,用于计算两个不同邮政编码之间的距离(使用 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
目标基本上是将美国所有相邻的邮政编码识别到我拥有的邮政编码列表中。如果有更好的方法,我愿意接受建议。
也许像下面这样。它会很慢,但它应该工作。
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)
}
}
}
}
这应该有效。给出一个很好的 list
作为输出(调用你的数据 x
):
rn = rownames(x)
apply(x, 2, function(z) rn[z < 2])
# $`91423`
# character(0)
#
# $`92231`
# character(0)
#
# $`94321`
# [1] "93201" "94501"
这是 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)