Вот подход с findInterval
из базы 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)
введите описание изображения здесь