[英]R: divide latitude and longitude into grid sections
I have latitude and longitude points: 我有经度和纬度点:
> 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
There are 413 of them. 有413个。 I would like to (two ways of saying the same thing):
我想(两种表达同一件事的方式):
stratify them into 9 groups (arranged in a grid) based on the latitude AND longitude. 根据纬度和经度,将其分为9组(按网格排列)。
draw gridlines like a tic-tac-toe board on a plot of lat vs lon and divide the points into bins (stratify) based on the grid cell they fall into. 在经纬度图上绘制像井字游戏棋盘格一样的网格线,并根据它们所属的网格将点划分为垃圾箱(分层)。
If I wanted to just divide the latitude into 9 groups, I could use the cut
function like this , but I'm essentially looking for a two-dimensional version of cut
. 如果我想将纬度划分为9个组,则可以像这样使用
cut
函数,但实际上是在寻找cut
的二维版本。
EDIT: 编辑:
Using the suggestion: how can I plot this? 使用建议:如何绘制此图?
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"
>
The problem is that the latitude and longitude must be in the same grid section. 问题在于,纬度和经度必须在同一网格部分中。 I might be wrong, but it doesn't look like that's happening here.
我可能是错的,但看起来好像不是在这里发生。
EDIT 2: Something's going wrong...getting NAs. 编辑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
FINAL SOLUTION: 最终解决方案:
#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))
One way is to use cut
on each axis. 一种方法是在每个轴上使用
cut
。
set.seed(2)
n <- 50
df <- data.frame(x = runif(n), y = runif(n))
head(df)
# x y
# 1 0.1848823 0.007109038
# 2 0.7023740 0.014693911
# 3 0.5733263 0.683403423
# 4 0.1680519 0.929720222
# 5 0.9438393 0.275401199
# 6 0.9434750 0.811859695
Now assign the bins, arbitrarily generating a 3x3 grid: 现在分配垃圾箱,任意生成3x3网格:
df <- within(df, {
grp.x = cut(x, (0:3)/3, labels = FALSE)
grp.y = cut(y, (0:3)/3, labels = FALSE)
})
head(df)
# x y grp.y grp.x
# 1 0.1848823 0.007109038 1 1
# 2 0.7023740 0.014693911 1 3
# 3 0.5733263 0.683403423 3 2
# 4 0.1680519 0.929720222 3 1
# 5 0.9438393 0.275401199 1 3
# 6 0.9434750 0.811859695 3 3
Now these can be used in grouping, coloring, etc. Here's a graph just for demonstration, but indicating that by color (Y-axis) and shape (X-axis), the points can be processed as a group. 现在可以将它们用于分组,着色等。这只是一个演示图,但是通过颜色(Y轴)和形状(X轴)指示可以将这些点作为一组进行处理。
plot(y ~ x, data = df, pch = (15:17)[grp.x], col = grp.y)
abline(v = (1:2)/3)
abline(h = (1:2)/3)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.