JPV*_*JPV 5 conditional r cumsum dplyr
我有城镇(从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
Run Code Online (Sandbox Code Playgroud)
城镇由(Town_From)组织并由(距离)安排.
在5公里半径范围内(从A到C),活1000(A)+ 500(C)= 1500人; 在下一个圈内活1500 + 800(在B中)= 2300.在第三圈内仍有2300人,因为城镇A,B,C在圆半径B到C = 17公里内.在圆半径A至D = 18km内,直播2300 + 200(在D中)= 2500人.
这是所讨论的圆圈的可视化.从理论上讲,圆圈可以扩展到任意半径.在实践中,我只需要在城镇对之间的距离(计数变化的地方)检查它们.
为此,如果您可以将数据转换为一种格式,其中每个城镇都代表距离的每个“末端”(目的地和出发地),那就更容易了。因此,我将您最后所做的更改改为Df此。请注意,它使用completefrom tidyr。
Df_full <-\n Df %>%\n bind_rows(\n select(Df, Town_From = Town_To, Town_To = Town_From, Distance)\n ) %>%\n complete(Town_From, Town_To, fill = list(Distance = 0)) %>%\n left_join(Df2, c("Town_To" = "Town"))\nRun Code Online (Sandbox Code Playgroud)\n\n这会反转“从”关系并将其附加到列表的底部。然后,它使用complete将城镇添加为自己的“To”(例如,从 A 到 A)。最后,它将人口加入进来,但现在只需要添加一次。这是新数据:
# A tibble: 16 \xc3\x97 4\n Town_From Town_To Distance Population\n <chr> <chr> <dbl> <dbl>\n1 A A 0 1000\n2 A B 10 800\n3 A C 5 500\n4 A D 18 200\n5 B A 10 1000\n6 B B 0 800\n7 B C 17 500\n8 B D 20 200\n9 C A 5 1000\n10 C B 17 800\n11 C C 0 500\n12 C D 21 200\n13 D A 18 1000\n14 D B 20 800\n15 D C 21 500\n16 D D 0 200\nRun Code Online (Sandbox Code Playgroud)\n\n接下来,我们设置我们想要探索的阈值。在您的问题中,您暗示您想要使用每个唯一的成对距离。如果您更喜欢其他套件用于生产用途,只需在此处输入即可。
\n\nradiusCuts <-\n Df_full$Distance %>%\n unique %>%\n sort\nRun Code Online (Sandbox Code Playgroud)\n\n然后,我们构建一个命令,仅对半径内的配对城市进行求和,并在此过程中设置名称以方便稍后sum使用。summarise_
forPops <-\n radiusCuts %>%\n setNames(paste("Pop within", ., "km")) %>%\n lapply(function(x){\n paste("sum(Population[Distance <=", x,"])")\n })\nRun Code Online (Sandbox Code Playgroud)\n\n最后,我们group_by将Town_From这些构造的参数传递给标准评估函数,summarise_该函数将创建以下中的每一列forPops:
Df_full %>%\n group_by(Town_From) %>%\n summarise_(.dots = forPops)\nRun Code Online (Sandbox Code Playgroud)\n\n给出:
\n\n# A tibble: 4 \xc3\x97 8\n Town_From `Pop within 0 km` `Pop within 5 km` `Pop within 10 km` `Pop within 17 km` `Pop within 18 km` `Pop within 20 km` `Pop within 21 km`\n <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>\n1 A 1000 1500 2300 2300 2500 2500 2500\n2 B 800 800 1800 2300 2300 2500 2500\n3 C 500 1500 1500 2300 2300 2300 2500\n4 D 200 200 200 200 1200 2000 2500\nRun Code Online (Sandbox Code Playgroud)\n\n这应该给你所有你想要的阈值。
\n