2017-06-21 73 views
1

我有一个igraph对象中每个顶点的邮编。我想使用ggmap将它们转换成地理坐标,这样我就可以计算边缘属性=地理距离。使用ggmap进行地理编码igraph顶点属性

require(igraph) 
require(ggmap) 

g <- graph.ring(6) 
V(grph)$postcode <- c("Johannesburg 2017", 
         "Rondebosch 8000", 
         "Durban 4001", 
         "Pietermaritzburg 3201", 
         "Jeffreys Bay 6330", 
         "Pretoria 0001") 

我想我可以生成每个顶点的地理坐标是这样的:

V(g)$coordinate <- geocode(V(g)$postcode, sensor = FALSE, 
          output = "latlon", source = "google") 

结果latlon的坐标列表所有顶点重复每个顶点,而不是每一个独特的latlon顶点。

head(head(V(g)$coordinate) 
[[1]] 
[1] 28.03837 28.31993 31.02204 30.36661 24.91015 28.18540 

[[2]] 
[1] -26.18825 -25.84222 -29.84962 -29.65119 -34.05067 -25.74895 

[[3]] 
[1] 28.03837 28.31993 31.02204 30.36661 24.91015 28.18540 

[[4]] 
[1] -26.18825 -25.84222 -29.84962 -29.65119 -34.05067 -25.74895 

[[5]] 
[1] 28.03837 28.31993 31.02204 30.36661 24.91015 28.18540 

[[6]] 
[1] -26.18825 -25.84222 -29.84962 -29.65119 -34.05067 -25.74895 

-ve numbers = latitude,+ ve numbers = longitude。我究竟做错了什么?

+0

geocode为每个邮政编码创建一个元组列表。每个元组都包含一个纬度和经度值。 – user2995175

回答

1

问题是geocode返回一个数据帧,但是当您将它分配给V(g)$coordinate时,它将它视为一个列表,并且循环使用列以获取每个顶点的值。

postcode_df <- geocode(V(g)$postcode, sensor = FALSE, 
          output = "latlon", source = "google") 

postcode_df 
#  lon  lat 
# 1 28.03837 -26.18825 
# 2 28.31993 -25.84222 
# 3 31.02204 -29.84962 
# 4 30.36661 -29.65119 
# 5 24.91015 -34.05067 
# 6 28.18540 -25.74895 

您需要将数据帧的每一行都转换为可分配给顶点的元素。这可以通过很多方式完成,这里有一个简单的方法:

V(g)$coordinate <- split(postcode_df, 1:nrow(postcode_df)) 

V(g)$coordinate 
# [[1]] 
# lon  lat 
# 1 28.03837 -26.18825 
# 
# [[2]] 
# lon  lat 
# 2 28.31993 -25.84222 
# 
# [[3]] 
# lon  lat 
# 3 31.02204 -29.84962 
# 
# [[4]] 
# lon  lat 
# 4 30.36661 -29.65119 
# 
# [[5]] 
# lon  lat 
# 5 24.91015 -34.05067 
# 
# [[6]] 
# lon  lat 
# 6 28.1854 -25.74895 
相关问题