Как разделить данные GPS-координат в R - PullRequest
0 голосов
/ 13 июля 2020

У меня есть большое поле с координатами 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

Это прямоугольный angular график (поле). Фактические данные здесь:

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

plot(df2015$Latitude, df2015$Longitude)

введите описание изображения здесь

Я хотел бы знать, как я могу разбить этот график размером 600 м на 400 м на 4 подполя равного размера и поместить их имена в свой фрейм данных df2015. Например, я хотел бы сгруппировать строки по частям A, B, C, D, как показано выше, и поместить уровни в исходный фрейм данных.

1 Ответ

1 голос
/ 13 июля 2020

Вот подход с 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)

введите описание изображения здесь

...