У меня есть города (от A до D), в которых проживает разное население и они находятся на разном расстоянии. Цель состоит в том, чтобы сложить общее население, живущее в радиусе круга (расстояние XY), где X - город в центре круга, а Y - любой другой город.
В этом коде:
Df <- structure(list(Town_From = c("A", "A", "A", "B", "B", "C"), Town_To = c("B",
"C", "D", "C", "D", "D"), Distance = c(10, 5, 18, 17, 20, 21)), .Names = c("Town_From",
"Town_To", "Distance"), row.names = c(NA, -6L), class = "data.frame")
Df2 <- structure(list(Town = c("A", "B", "C", "D"), Population = c(1000,
800, 500, 200)), .Names = c("Town", "Population"), row.names = c(NA,
-4L), class = "data.frame")
Df <- Df %>% left_join(Df2,by=c("Town_From"="Town")) %>%
left_join(Df2,by=c("Town_To"="Town"))%>%
group_by(Town_From) %>%
arrange(Distance)
colnames(Df)[4]<-c("pop_TF")
colnames(Df)[5]<-c("pop_TT")
Source: local data frame [6 x 5]
Groups: Town_From [3]
Town_From Town_To Distance pop_TF pop_TT
<chr> <chr> <dbl> <dbl> <dbl>
1 A C 5 1000 500
2 A B 10 1000 800
3 B C 17 800 500
4 A D 18 1000 200
5 B D 20 800 200
6 C D 21 500 200
города были организованы (Town_From) и упорядочены (расстояние).
В пределах круга радиусом 5 км (от А до С) живут 1000 (в А) + 500 (в В) = 1500 человек; в следующем круге живут 1500 + 800 (в Б) = 2300. В третьем круге по-прежнему проживает 2300 человек, потому что города A, B, C находятся в радиусе круга от B до C = 17 км. В радиусе круга от A до D = 18 км проживает 2300 + 200 (в D) = 2500 человек.
Вот визуализация рассматриваемых кругов. Теоретически круги могут расширяться до любого произвольного радиуса. На практике мне нужно проверить их только на расстояниях между парами городов (мест, где меняются счета).
Town_From
, (ii) отсортировать каждый из них поDistance
, а затем (iii) вычислитьcumsum
. - person aichao   schedule 18.01.2017C-A-B
, где каждый-
составляет 4 км. От A все три города находятся в пределах 5 км. Но из B только A и B. (есть отдельная проблема, состоящая в том, что выдуманные расстояния в данных вашего примера не совсем отражают возможную реальность.) Если вы хотите задать новый вопрос, сделайте это. Не меняйте то, о чем вы просите, и не принимайте ответ. - person Mark Peterson   schedule 20.01.2017