Моя конечная цель - соединить всех ближайших соседей из набора зданий (на основе евклидова расстояния) на ggmap, используя geom_path из пакета ggplot2. Мне нужна помощь с петлей, которая позволит мне максимально легко построить всех соседейСопоставление ближайших соседей длинного набора данных с использованием ggmap, geom_point и петли
Я создал матрицу расстояний (называемую «kmnew») в километрах от трех типов зданий в Пекине: B (x2), D (х2) и L (x1):
B B D D L
B NA 6.599014 5.758531 6.285787 3.770175
B NA NA 7.141096 3.873296 5.092667
D NA NA NA 3.690725 2.563017
D NA NA NA NA 2.832083
L NA NA NA NA NA
попытки различить ближайшие сосед каждое здания по ряду путем объявления матрицы и с помощью цикла, чтобы установить ближайший сосед здание:
nn <- matrix(NA,nrow=5,ncol=1)
for (i in 1:nrow(kmnew)){
nn[i,] <- which.min(kmnew[i,])
}
Это возвращает следующую ошибку (не уверен, почему):
Error in nn[i, ] <- which.min(kmnew[i, ]) : replacement has length zero
но, кажется, возвращает правильный ответ яя:
[,1]
[1,] 5
[2,] 4
[3,] 5
[4,] 5
[5,] NA
я добавляю это к оригинальной dataframe называется newbjdata:
colbj <- cbind(newbjdata,nn)
, который возвращает
Name Store sqft long lat nn
1 B 1 1200 116.4579 39.93921 5
2 B 2 750 116.3811 39.93312 4
3 D 1 550 116.4417 39.88882 5
4 D 2 600 116.4022 39.90222 5
5 L 1 1000 116.4333 39.91100 NA
Затем я извлекаю свою карту через ggmap:
bjgmap <- get_map(location = c(lon = 116.407395,lat = 39.904211),
zoom = 13, scale = "auto",
maptype = "roadmap",
messaging = FALSE, urlonly = FALSE,
filename = "ggmaptemp", crop = TRUE,
color = "bw",
source = "google", api_key)
Моя конечная цель - сопоставить ближайших соседей на участке с использованием geom_path из пакета ggplot.
Например, nn 1-го здания типа B (строка 1) является 1-м зданием типа L (строка 5). Очевидно, что я могу сделать эту линию Подменят указанные 2 строк в dataframe таким образом:
ggmap(bjgmap) +
geom_point(data = colbj, aes(x = long,y = lat, fill = factor(Name)),
size =10, pch = 21, col = "white") +
geom_path(data = subset(colbj[c(1,5),]), aes(x = long,y = lat),col = "black")
Однако, мне нужно решение, которое работает как цикл, и я не могу понять, как можно достичь этого, как Мне нужно ссылаться на столбец nn и ссылаться на него на длинные латинские данные n раз. Я вполне могу поверить, что я не использую самый эффективный метод, поэтому я открыт для альтернатив. Любая помощь очень ценится.
Не могли бы вы объяснить, что вы имеете в виду, говоря «пп 1-го здания типа В (строка 1) является 1 здание типа L (строка 5)»? Я этого не понимаю. Как вы хотите нарисовать линии? Здесь у вас есть 5 баллов на вашей карте. Что бы вы хотели в конце? – jazzurro
Столбец ближайшего соседа (nn) моего фрейма данных относится к тому, какая строка является ближайшим соседом. Таким образом, nn (ближайший сосед) строки 1 (B store 1) является строкой 5 (L store 1). Моя цель - соединить всех ближайших соседей по строке (geom_path), так как я подключил эти два вручную в минимальном примере, за исключением более автоматизированного способа, чем я достиг с использованием «подмножества». Большое спасибо! – RichS
Это означает, что у вас есть одна строка, идущая куда-то из каждой точки данных. Это верно? – jazzurro