[英]Subsetting Matrix Based on contents of dataframe
我有一個100X100的相關矩陣,其中郵政編碼為列名和行名。 我還有一個數據框,其中包含所有zipcdes的緯度和經度,以及一個基於緯度和經度計算距離的函數。
這是相關矩陣的片段
08846 48186 90621 92602 92701 92702 92703 92705 92706 92712
08846 1.00000000 -0.18704668 0.17631080 -0.0195590 -0.08640209 -0.09109788 -0.04251868 -0.1586506 -0.0778115 -0.0572327
48186 -0.18704668 1.00000000 -0.09365048 0.1616530 0.20468051 0.17682056 0.18009911 0.1417840 0.1958971 0.1938676
90621 0.17631080 -0.09365048 1.00000000 0.5880756 0.75200501 0.74694849 0.76071605 0.6593806 0.7640519 0.7657806
92602 -0.01955900 0.16165299 0.58807565 1.0000000 0.88187818 0.88947447 0.89310793 0.9615530 0.8926566 0.8926482
92701 -0.08640209 0.20468051 0.75200501 0.8818782 1.00000000 0.99314798 0.98011569 0.9294281 0.9827633 0.9886139
92702 -0.09109788 0.17682056 0.74694849 0.8894745 0.99314798 1.00000000 0.98791442 0.9470895 0.9853157 0.9933086
92703 -0.04251868 0.18009911 0.76071605 0.8931079 0.98011569 0.98791442 1.00000000 0.9321385 0.9938496 0.9981231
92705 -0.15865058 0.14178399 0.65938061 0.9615530 0.92942815 0.94708954 0.93213849 1.0000000 0.9268797 0.9357917
92706 -0.07781150 0.19589706 0.76405191 0.8926566 0.98276329 0.98531570 0.99384961 0.9268797 1.0000000 0.9948550
92712 -0.05723270 0.19386757 0.76578065 0.8926482 0.98861389 0.99330864 0.99812312 0.9357917 0.9948550 1.0000000
這是郵政編碼表的片段
zip city state latitude longitude
1 00210 Portsmouth NH 43.0059 -71.0132
2 00211 Portsmouth NH 43.0059 -71.0132
3 00212 Portsmouth NH 43.0059 -71.0132
4 00213 Portsmouth NH 43.0059 -71.0132
5 00214 Portsmouth NH 43.0059 -71.0132
6 00215 Portsmouth NH 43.0059 -71.0132
這是taht計算緯度和經度之間的距離的函數。
Calc_Dist <- function (long1, lat1, long2, lat2)
{
rad <- pi/180
a1 <- lat1 * rad
a2 <- long1 * rad
b1 <- lat2 * rad
b2 <- long2 * rad
dlon <- b2 - a2
dlat <- b1 - a1
a <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2
c <- 2 * atan2(sqrt(a), sqrt(1 - a))
R <- 6378.145
d <- R * c
return(d)
}
我在這里的目標是對相關矩陣進行子集處理,以僅包括相距超過500英里的郵政編碼(現在距離計算的輸出以公里為單位,但是可以輕松更改,並且現在不重要)。 價格越便宜越好,因為我可能需要使用更大的相關矩陣(〜10000 x 10000)。 有什么建議么?
預先感謝,本
您必須使用該距離功能至關重要嗎? 我認為dist
應該更有效。
#Making your zip.table a data.table helps us with speed
library(reshape)
library(data.table)
setDT(zip.table)
#Calculate distance matrix and put into table form
setorder(zip.dist,zip)
zip.dist <- dist(zip.table[,.(longitude=abs(longitude),latitude)])
zip.dist <- as.matrix(zip.dist)
zip.dist <- melt(zip.dist)[melt(upper.tri(zip.dist))$value,]
setDT(zip.dist)
setnames(zip.dist,c("zip1", "zip2", "distance"))
#Do a very similar procedure with your correlation matrix
#It is important that you sorted your zip.table by zip before applying `cor`
zip.corr <- as.matrix(zip.corr)
zip.corr <- melt(zip.corr)[melt(upper.tri(zip.corr))$value,]
setDT(zip.corr)
setnames(zip.corr,c("zip1", "zip2", "cor"))
#Subset zip.dist to only include zip codes more than 500 miles apart
zip.dist <- zip.dist[distance*69 > 500] #69 mile ~ 1 degreen lat/lon
#Merge together
setkey(zip.dist,zip1,zip2)
setkey(zip.corr,zip1,zip2)
result.table <- zip.dist[zip.corr, nomatch=0]
由於這些地方彼此之間非常接近,所以我認為使用歐幾里得距離不會給您帶來太多損失。 特別是因為它是一個大縣內的一個經緯度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.