【发布时间】:2017-04-19 00:41:44
【问题描述】:
我有经纬度点:
> d1 <- data.frame(lat, lon)
> head(d1)
lat lon
1 43.25724 -96.01955
2 43.25724 -95.98172
3 43.25724 -95.92336
4 43.25616 -96.40973
5 43.25616 -96.25733
6 43.25616 -96.17735
其中有 413 个。我想(两种说法):
根据纬度和经度将它们分成 9 组(按网格排列)。
在 lat 与 lon 的图上像井字棋一样绘制网格线,并根据它们所在的网格单元将点划分为 bin(分层)。
如果我只想将纬度分成 9 组,我可以使用cut 函数like this,但我实际上是在寻找cut 的二维版本。
编辑:
使用建议:如何绘制?
paste(cut(lat, 3, labels=FALSE), cut(lon, 3, labels=FALSE))
[1] "3 3" "3 3" "3 3" "3 1" "3 2" "3 2" "3 3" "3 3" "3 2" "3 1" "3 2" "3 1" "3 2"
[14] "3 3" "3 3" "3 1" "3 3" "3 2" "3 2" "3 2" "3 1" "3 3" "3 1" "3 1" "3 3" "3 2"
[27] "3 2" "3 2" "3 1" "3 2" "3 1" "3 3" "3 1" "3 3" "3 1" "3 2" "3 3" "3 2" "3 2"
[40] "3 3" "3 3" "3 2" "3 2" "3 2" "3 3" "3 1" "3 3" "3 3" "3 3" "3 2" "3 3" "3 3"
[53] "3 2" "3 2" "3 3" "3 3" "3 1" "3 2" "3 1" "3 2" "3 2" "3 2" "3 3" "3 2" "3 3"
[66] "3 3" "3 3" "3 3" "3 3" "3 3" "3 3" "3 1" "3 2" "3 3" "3 1" "3 1" "3 1" "3 1"
[79] "3 2" "3 2" "3 2" "3 1" "3 3" "3 2" "3 2" "3 2" "3 3" "3 3" "3 1" "3 3" "3 1"
[92] "3 3" "3 3" "3 1" "3 3" "3 1" "3 3" "3 1" "3 2" "3 3" "3 3" "3 2" "3 2" "3 1"
[105] "3 1" "3 3" "3 2" "3 2" "3 3" "3 3" "3 3" "3 2" "3 1" "3 1" "3 2" "3 2" "3 2"
[118] "3 1" "3 1" "3 2" "3 3" "3 2" "3 2" "3 3" "3 2" "3 1" "3 3" "3 3" "3 1" "3 3"
[131] "3 1" "3 1" "3 3" "2 2" "2 2" "2 1" "2 1" "2 2" "2 3" "2 1" "2 2" "2 2" "2 3"
[144] "2 1" "2 2" "2 3" "2 3" "2 2" "2 3" "2 3" "2 2" "2 2" "2 3" "2 2" "2 1" "2 2"
[157] "2 2" "2 3" "2 3" "2 1" "2 1" "2 2" "2 1" "2 1" "2 1" "2 3" "2 2" "2 3" "2 3"
[170] "2 3" "2 2" "2 3" "2 3" "2 2" "2 1" "2 1" "2 1" "2 2" "2 2" "2 2" "2 2" "2 2"
[183] "2 3" "2 1" "2 2" "2 2" "2 3" "2 3" "2 2" "2 2" "2 3" "2 2" "2 2" "2 2" "2 1"
[196] "2 3" "2 1" "2 2" "2 3" "2 3" "2 1" "2 3" "2 3" "2 1" "2 2" "2 1" "2 2" "2 3"
[209] "2 1" "2 3" "2 2" "2 2" "2 2" "2 3" "2 2" "2 1" "2 2" "2 2" "2 3" "2 3" "2 3"
[222] "2 2" "2 3" "2 2" "2 1" "2 1" "2 2" "2 2" "2 3" "2 2" "2 3" "2 2" "2 2" "2 1"
[235] "2 2" "2 2" "2 3" "2 2" "2 3" "2 3" "2 3" "2 3" "2 1" "2 1" "2 2" "2 2" "2 3"
[248] "2 1" "2 2" "2 3" "2 2" "2 3" "2 3" "2 1" "2 1" "2 3" "2 3" "2 1" "2 3" "2 1"
[261] "2 1" "2 1" "2 3" "2 1" "2 2" "2 2" "2 2" "2 3" "2 3" "2 1" "2 1" "2 2" "2 3"
[274] "2 3" "2 2" "2 2" "2 1" "1 2" "1 2" "1 3" "1 3" "1 1" "1 1" "1 2" "1 2" "1 2"
[287] "1 2" "1 1" "1 3" "1 3" "1 2" "1 1" "1 1" "1 1" "1 2" "1 1" "1 1" "1 3" "1 2"
[300] "1 2" "1 2" "1 3" "1 1" "1 3" "1 1" "1 3" "1 2" "1 1" "1 2" "1 2" "1 2" "1 1"
[313] "1 3" "1 1" "1 1" "1 2" "1 3" "1 1" "1 2" "1 1" "1 2" "1 1" "1 3" "1 2" "1 2"
[326] "1 1" "1 2" "1 3" "1 3" "1 1" "1 2" "1 3" "1 3" "1 1" "1 3" "1 3" "1 1" "1 2"
[339] "1 2" "1 2" "1 3" "1 1" "1 2" "1 3" "1 2" "1 3" "1 3" "1 1" "1 2" "1 2" "1 1"
[352] "1 1" "1 2" "1 2" "1 3" "1 3" "1 1" "1 2" "1 2" "1 3" "1 1" "1 2" "1 2" "1 3"
[365] "1 1" "1 2" "1 1" "1 3" "1 3" "1 1" "1 1" "1 2" "1 2" "1 3" "1 1" "1 3" "1 1"
[378] "1 3" "1 3" "1 1" "1 1" "1 2" "1 3" "1 2" "1 1" "1 2" "1 3" "1 3" "1 2" "1 2"
[391] "1 3" "1 1" "1 2" "1 2" "1 3" "1 2" "1 2" "1 3" "1 1" "1 3" "1 1" "1 2" "1 2"
[404] "1 2" "1 1" "1 3" "1 1" "1 2" "1 1" "1 1" "1 1" "1 3" "1 1"
>
问题是纬度和经度必须在同一个网格部分。我可能是错的,但看起来这里并没有发生这种情况。
编辑 2:出了点问题...获取 NA。
> df2 <- data.frame(lat, lon)
> df2 <- within(df2, {
+ grp.lat = cut(lat, (0:3)/3, labels = FALSE)
+ grp.lon = cut(lon, (0:3)/3, labels = FALSE)
+ })
> head(df2)
lat lon grp.lon grp.lat
1 43.25724 -96.01955 NA NA
2 43.25724 -95.98172 NA NA
3 43.25724 -95.92336 NA NA
4 43.25616 -96.40973 NA NA
5 43.25616 -96.25733 NA NA
6 43.25616 -96.17735 NA NA
最终解决方案:
#Divide the dataset into equally-sized chunks, as evenly as possible, for 9 chunks (coarse)
df2 <- data.frame(lat, lon)
df2 <- within(df2, {
grp.lat = cut(lat, 3, labels = FALSE)
grp.lon = cut(lon, 3, labels = FALSE)
})
head(df2)
#Want the minimum lon value for which grp.lon = 1 and the maximum lon value for which grp.lon=1
start_grp1_lon <- min(df2$lon[df2$grp.lon==1])
start_grp2_lon <- min(df2$lon[df2$grp.lon==2])
start_grp3_lon <- min(df2$lon[df2$grp.lon==3])
start_grp1_lat <- min(df2$lat[df2$grp.lat==1])
start_grp2_lat <- min(df2$lat[df2$grp.lat==2])
start_grp3_lat <- min(df2$lat[df2$grp.lat==3])
plot(lat ~ lon, data = df2, pch = (15:23)[grp.lon*grp.lat], col=[grp.lon]) #pch = (15:17)[grp.lon], col = grp.lat)
abline(v = c(start_grp1_lon, start_grp2_lon, start_grp3_lon))
abline(h = c(start_grp1_lat, start_grp2_lat, start_grp3_lat))
【问题讨论】:
-
这样的?同时将
cut应用于两列:df$group <- paste(cut(df$lat, 3, labels=FALSE), cut(df$lon, 3, labels=FALSE)) -
这似乎并没有把纬度和经度放在一起。
-
“保持经纬度”是什么意思?
-
?ggplot2::geom_bin2d -
在EDIT2中:使用间隔数而不是断点,例如
grp.lat = cut(lat, 3, labels = FALSE)。
标签: r