子集一系列long和lat值

时间:2015-11-04 18:45:30

标签: r maps

我有两个data.frames,范围为纬度/经度。其中一个范围是df1,包括我需要保留的所有值。第二个范围df2是各种各样的范围。见下面的地图。

我正在尝试将df2与仅位于df1范围内的纬度/经度进行分组。但是,我正在使用min()max()函数来尝试保留这些范围,但它无法正常工作。通过使用这两个函数,它仅考虑lat和long之间的线性关系,而不是最接近的。请参阅地图下的代码。

这些是我需要在德克萨斯州df1内保持的范围: enter image description here

这些都是我可用的范围df2enter image description here

dput df1

df1 <- structure(list(lat = c(29.6666666666667, 29.4166666666667, 27.9166666666667, 
31.25, 30.7083333333333, 32.9166666666667, 29.7916666666667, 
32.1666666666667, 30.5416666666667, 28.6666666666667, 31.25, 
29.875, 30.6666666666667, 31, 29.7916666666667, 33, 36.4583333333333, 
28.5833333333333, 29.375, 32.5, 32.375, 29.3333333333333, 29.1666666666667, 
30.5416666666667, 33.0833333333333, 31.9583333333333, 31.375, 
32.5416666666667, 31.25, 32.125, 29.875, 30.2083333333333, 30.125, 
35.9166666666667, 34.25, 31.5416666666667, 32.375, 31.2083333333333, 
27.2916666666667, 33.2916666666667, 33.9583333333333, 29.9166666666667, 
28.75, 34.625, 30.25, 34.2083333333333, 32.375, 34.125, 31.7916666666667, 
31.625, 32.2916666666667, 29.3333333333333, 30.7916666666667, 
30.2916666666667, 31.9583333333333, 29.2083333333333, 31.6666666666667, 
30.7916666666667, 31.25, 31.875, 32.2083333333333, 30.5416666666667, 
35.3333333333333, 29.0833333333333, 29.7916666666667, 30.125, 
34.0416666666667, 30.125, 34.0833333333333, 27.25, 32.6666666666667, 
30.0416666666667, 32.5416666666667, 31.5, 33.8333333333333, 29.5, 
25.9583333333333, 26.4583333333333, 30.5, 26.5833333333333, 31.75, 
34.9583333333333, 31.0833333333333, 30.75, 31.9166666666667, 
32.2083333333333, 30.6666666666667, 29.5833333333333, 33.5, 33.5833333333333, 
30.625, 30, 34.2916666666667, 31.875, 30.7083333333333, 33.0416666666667, 
32.625, 32.7916666666667, 29.1666666666667, 33.5), long = c(-100.208333332859, 
-96.4583333328374, -97.3749999995093, -103.95833333288, -98.8333333328509, 
-102.916666666207, -103.41666666621, -99.9999999995242, -94.4166666661591, 
-95.9999999995014, -102.74999999954, -100.583333332861, -99.9999999995242, 
-101.458333332866, -104.458333332883, -96.3333333328367, -102.333333332871, 
-99.208333332853, -94.7499999994943, -97.49999999951, -98.7083333328502, 
-100.166666666192, -99.7083333328559, -97.0833333328409, -98.4166666661819, 
-97.7499999995114, -93.99999999949, -101.583333332867, -104.374999999549, 
-97.9583333328459, -100.041666666191, -100.45833333286, -95.2083333328303, 
-101.208333332864, -99.7499999995228, -100.374999999526, -100.916666666196, 
-100.499999999527, -99.3333333328537, -95.2916666661641, -102.249999999537, 
-98.333333332848, -97.5416666661769, -102.083333332869, -102.083333332869, 
-99.1666666661861, -102.083333332869, -99.5833333328552, -96.9166666661733, 
-103.749999999546, -97.1666666661747, -95.7916666661669, -102.541666666205, 
-94.9166666661619, -100.249999999526, -95.3749999994979, -101.208333332864, 
-98.1249999995135, -94.3749999994922, -97.3749999995093, -97.7916666661783, 
-98.333333332848, -100.249999999526, -97.7499999995114, -97.49999999951, 
-101.333333332865, -98.791666666184, -95.2083333328303, -99.6249999995221, 
-97.7499999995114, -101.874999999535, -94.4166666661591, -98.1666666661804, 
-100.124999999525, -96.8333333328395, -96.3749999995036, -97.2916666661754, 
-98.9999999995185, -102.624999999539, -97.5416666661769, -104.541666666217, 
-100.666666666195, -97.8333333328452, -94.8333333328281, -99.2499999995199, 
-95.9166666661676, -94.4166666661591, -94.5416666661598, -98.1249999995135, 
-95.2916666661641, -101.458333332866, -104.166666666215, -102.541666666205, 
-95.5416666661655, -93.7083333328217, -96.2083333328359, -95.7083333328331, 
-95.2499999994971, -96.0833333328352, -100.124999999525)), .Names = c("lat", 
"long"), row.names = c(85680L, 1319359L, 1830830L, 1304489L, 
1072503L, 462516L, 678461L, 257507L, 1909316L, 1599092L, 551980L, 
948368L, 1707870L, 1507833L, 1190987L, 681396L, 1321319L, 133499L, 
1213001L, 18800L, 1060501L, 1295647L, 334268L, 399477L, 1030612L, 
1390228L, 255017L, 1652752L, 795949L, 761335L, 310677L, 985728L, 
887656L, 242521L, 1514901L, 1346114L, 962315L, 1908903L, 1911307L, 
124567L, 58313L, 1394404L, 763303L, 1843111L, 857880L, 298692L, 
1373653L, 914743L, 166059L, 1754481L, 1219252L, 312112L, 852388L, 
396677L, 906070L, 152644L, 1007020L, 1317142L, 863194L, 1141341L, 
706510L, 1467240L, 35951L, 1482008L, 979650L, 409405L, 1236400L, 
962680L, 837083L, 94376L, 533974L, 1631418L, 251492L, 1383646L, 
726181L, 1356856L, 1655225L, 1907020L, 1902953L, 786466L, 1658482L, 
1585289L, 1352146L, 1865639L, 268501L, 1628615L, 671385L, 642906L, 
1243516L, 441432L, 645239L, 253095L, 733426L, 562744L, 250656L, 
1892959L, 372300L, 374497L, 598520L, 1483079L), class = "data.frame")

dput df2

df2 <- structure(list(lat = c(-21.28, 41.3686, 33.9107, 25.12, 30.8275, 
29.4886, 34.1586, 45.15, 16.083, 40.0478, -20.5525, 42.35, 35.615, 
39.6825, -34.7122, 64.45, 29.5853, -13.2287, 38.8097, -31.3292, 
43.1, 31.4221, -30.4291, 38.5642, 36.0617, 37.6386, 6.0833, -21.5119, 
43.0481, 46.3333, 44.9992, 47.0653, 35.5678, 40.3038, 46.8352, 
26.3559, 21.0867, -41.1964, 45.3, 34.3328, 44.6667, 32.6089, 
58.4167, 35.9755, -30.4869, -28.9667, 40.3004, -38.35, 41.4449, 
33.6012, 22.23, 35.35, 45.0592, 22.0167, 38.25, -26.6667, 42.425, 
-22.97, 35.3692, 37.2331, 43.117, -30, 40.133, 37.8747, 32.2531, 
42.1833, 46.6907, 33.1353, 59.9167, 34.6737, 58.82, 40.0732, 
40.3691, -8.12, -5.58, 35.6558, 61.7133, 49.3, -10.45, 43.0048, 
33.4139, 39.6, 58.3622, 60.68, 34.683, -9.76, 34.3648, 61.07, 
-8.82, 45.7034, 41.3262, 46.5689, 46.875, -25.7683, 45.6, 26.6211, 
51.9, 63, 40.867, 40.221), long = c(-50.35, -96.095, -78.3025, 
82.9, -100.1103, -81.2402, -78.8603, -115.3167, 120.35, -105.2672, 
144.0367, -84.3167, -87.0353, -86.258, 138.9469, 17.0797, -98.7011, 
131.1355, -90.0028, 116.0811, -82, -100.5003, 150.5298, -123.1617, 
-98.59, -84.1098, 171.7333, 144.6339, -82.9239, -61.1, -101.2314, 
-91.6761, -82.8394, -103.1114, -96.7914, -80.2238, -157.0225, 
145.9997, -74.3, -84.4703, -71.2167, -85.0756, -130.0333, -79.3095, 
118.1258, 152.8167, -74.3311, 146.2, -86.0116, -79.0143, 87.8, 
-78.0333, -83.9011, -159.45, 140.35, 146.6167, -103.7358, -47.08, 
-117.6525, -119.5047, -88.4839, 141.6167, -99.8238, -111.9731, 
-107.7531, -76.5167, -120.4949, -107.2317, -113.9333, -83.0005, 
17.3297, -99.6668, -78.4174, -35.18, -45.88, -88.0064, 6.6164, 
-99.45, -45.15, -79.2657, -84.5958, 45.5, -134.5711, 16.35, 131.783, 
-66.61, -86.2361, 18.68, -36.05, -122.6106, -82.492, -96.0886, 
-111.1633, 152.525, -107.45, -80.2021, 127.7, -156.0667, 45.15, 
-85.1036)), .Names = c("lat", "long"), row.names = c(20755L, 
82475L, 60665L, 37831L, 89680L, 52520L, 85455L, 76368L, 40639L, 
49579L, 5712L, 80268L, 67350L, 55970L, 4897L, 44788L, 67992L, 
3294L, 76550L, 1484L, 29090L, 69644L, 10326L, 73682L, 86352L, 
57349L, 40579L, 6809L, 79978L, 31106L, 88426L, 59085L, 61056L, 
51946L, 61720L, 52929L, 94259L, 16494L, 29857L, 75694L, 83389L, 
75916L, 25284L, 60523L, 2177L, 11182L, 62281L, 15180L, 55504L, 
66088L, 38023L, 85213L, 80153L, 94573L, 38225L, 9135L, 95606L, 
20939L, 74353L, 95070L, 71753L, 9330L, 46103L, 91127L, 83769L, 
84903L, 71489L, 84234L, 26978L, 66221L, 44019L, 46099L, 65381L, 
22766L, 21947L, 89020L, 40132L, 27797L, 22964L, 31892L, 75937L, 
214L, 94704L, 44385L, 38284L, 18206L, 47344L, 44434L, 22829L, 
70909L, 64053L, 80756L, 82150L, 8132L, 81874L, 52925L, 41594L, 
93980L, 186L, 56140L), class = "data.frame")

代码:

library(dplyr)
db <- filter(df2, lat >= min(df1$lat) & lat <= max(df1$lat) & 
                                                            long >= min(df1$long) & long <= max(df1$long))

以下是绘制的结果。你可以看到俄克拉荷马州的这一点不应该被包括在内,因为它超出了范围,但是因为纬度与德克萨斯州的点线性相关,所以它包括在内。我不知道如何进一步解决这个问题,并希望得到任何帮助。

我的问题是如何使用lat / long将df2中的范围与df1进行分组?

enter image description here

1 个答案:

答案 0 :(得分:3)

您可以使用库maps查看某个点所处的状态,然后将那些不匹配的状态进行子集化。

library(maps)
df2$state <- map.where("state", df2$long, df2$lat)
df2[df2$state == "texas" & !is.na(df2$state),]

          lat      long state
89680 30.8275 -100.1103 texas
67992 29.5853  -98.7011 texas
69644 31.4221 -100.5003 texas

编辑:如果你想使用不仅仅是状态的区域来做,我们可以创建一个空间多边形,然后看看这些点是否在那里。我使用了来自this answer的修改后的代码。

首先我们创建一个&#34;凸包&#34;并将其转换为空间多边形:

library("sp")
library("rgdal")

ch <- chull(df1$long, df1$lat)
coords <- df1[c(ch, ch[1]), ]
sp_poly <- SpatialPolygons(list(Polygons(list(Polygon(coords)), ID = 1)))
plot(df1$lat, df1$long)
lines(coords, col="red")

enter image description here

然后我们找出其中的哪些点:

coordinates(df2) <- ~lat + long
coords <- over(df2, sp_poly)
df2[coords == 1 & !is.na(coords),]

SpatialPoints:
          lat      long
89680 30.8275 -100.1103
67992 29.5853  -98.7011
69644 31.4221 -100.5003
相关问题