如何在R中拆分GPS坐标数据

How to split GPS coordinate data in R

我有一个带有经纬度 GPS 坐标的大字段。

我的数据是这样的:

> head(df2015, 10)
     X    Yield   Latitude Longitude
1   97 40.85889  0.8848444  120.8712
2   98 43.54383  2.1551468  120.8833
3   99 42.33718  3.4424795  120.8776
4  100 39.21862  4.7188642  120.8685
5  101 38.24887  6.0019946  120.8820
6  102 36.95594  7.2819180  120.8943
7  103 34.00766  8.5942431  120.8902
8  104 34.58568  9.8706278  120.8970
9  105 34.47788 11.1475653  120.8912
10 106 34.20532 12.4183101  120.8910

这是一个矩形地块(场)。实际数据在这里:

df2015 <- read.table("https://raw.githubusercontent.com/yamunadhungana/data/master/home.2015.csv", header = TRUE, sep = ",")

plot(df2015$Latitude, df2015$Longitude)

我想知道如何将这个 600 米 x 400 米大小的地块分成 4 个大小相等的子字段,并将它们的名称放入我的数据框中 df2015。例如,我想按子图 A、B、C、D 对行进行分组,如上所示,并将级别放入我的原始数据框中。

这是一种方法 findInterval 来自 base R:

df2015 <- read.table("https://raw.githubusercontent.com/yamunadhungana/data/master/home.2015.csv", header = TRUE, sep = ",")
pos.matrix <- matrix(LETTERS[c(2,3,1,4)],byrow = TRUE, nrow = 2)
pos.matrix
#     [,1] [,2]
#[1,] "B"  "C" 
#[2,] "A"  "D" 

df2015$grid <- apply(cbind(findInterval(df2015[,"Latitude"],seq(0,400,by = 200)),
                           3-findInterval(df2015[,"Longitude"],seq(0,600,by = 300))),
                     1,function(x){pos.matrix[x[2],x[1]]})
df2015[1:10,]
#     X    Yield   Latitude Longitude grid
#1   97 40.85889  0.8848444  120.8712    A
#2   98 43.54383  2.1551468  120.8833    A
#3   99 42.33718  3.4424795  120.8776    A
#4  100 39.21862  4.7188642  120.8685    A
#5  101 38.24887  6.0019946  120.8820    A
#6  102 36.95594  7.2819180  120.8943    A
#7  103 34.00766  8.5942431  120.8902    A
#8  104 34.58568  9.8706278  120.8970    A
#9  105 34.47788 11.1475653  120.8912    A
#10 106 34.20532 12.4183101  120.8910    A

网格位置现在是 df2015 中的新列。您可以使用 split 将 data.frame 分成网格位置列表。

这是确认正确分配的可视化:

set.seed(3)
mysamp <- sample(seq_len(nrow(df2015)),250)
plot(NA, xlim = c(0,400), ylim = c(0,600), xlab = "Latitude", ylab = "Longitude")
text(df2015[mysamp,c("Latitude","Longitude")],
     labels = df2015[mysamp,"grid"], cex = 0.4)