如何在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)
我有一个带有经纬度 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)