gpt4 book ai didi

r - 条件变异 cumsum dplyr

转载 作者:行者123 更新时间:2023-12-04 18:59:20 25 4
gpt4 key购买 nike

我有城镇(从 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) 组织并由 (distance) 排列。

5km半径范围内(从A到C)住1000(在A)+500(在C)=1500人;在下一个圈内住 1500 + 800(在 B 中)=2300。在第三圈内仍然住着 2300 人,因为城镇 A、B、C 在半径 B 到 C = 17 公里的范围内。在Circle半径A到D=18km内,住2300+200(在D)=2500人。

这是有关圆圈的可视化。理论上,圆可以扩展到任意半径。在实践中,我只需要在城镇对(计数发生变化的地方)之间的距离处检查它们。

enter image description here

最佳答案

为此,如果您可以将数据放入一种格式,其中每个城镇都在距离的每个“末端”(到达和来自)的每个“末端”上表示,则更容易。所以,我把你最后做的修改改成了Df改为。请注意,它使用 complete来自 tidyr .

Df_full <-
Df %>%
bind_rows(
select(Df, Town_From = Town_To, Town_To = Town_From, Distance)
) %>%
complete(Town_From, Town_To, fill = list(Distance = 0)) %>%
left_join(Df2, c("Town_To" = "Town"))

这将反转 to-from 关系并将其附加到列表的底部。然后,它使用 complete添加城镇作为它自己的“到”(例如,从 A 到 A)。最后,它加入了种群,但现在只需要添加一次。这是新数据:
# A tibble: 16 × 4
Town_From Town_To Distance Population
<chr> <chr> <dbl> <dbl>
1 A A 0 1000
2 A B 10 800
3 A C 5 500
4 A D 18 200
5 B A 10 1000
6 B B 0 800
7 B C 17 500
8 B D 20 200
9 C A 5 1000
10 C B 17 800
11 C C 0 500
12 C D 21 200
13 D A 18 1000
14 D B 20 800
15 D C 21 500
16 D D 0 200

接下来,我们设置我们想要探索的阈值。在您的问题中,您暗示要使用每个唯一的成对距离。如果您更喜欢其他一些用于生产用途的设置,只需在此处输入它们。
radiusCuts <-
Df_full$Distance %>%
unique %>%
sort

然后,我们构造一个 sum该命令将仅对半径内的配对城市求和,在此过程中设置名称以简化 summarise_ 的使用一会儿。
forPops <-
radiusCuts %>%
setNames(paste("Pop within", ., "km")) %>%
lapply(function(x){
paste("sum(Population[Distance <=", x,"])")
})

最后,我们 group_by Town_From并将这些构造的参数传递给标准评估函数 summarise_这将创建 forPops 中的每一列:
Df_full %>%
group_by(Town_From) %>%
summarise_(.dots = forPops)

给出:
# A tibble: 4 × 8
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`
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A 1000 1500 2300 2300 2500 2500 2500
2 B 800 800 1800 2300 2300 2500 2500
3 C 500 1500 1500 2300 2300 2300 2500
4 D 200 200 200 200 1200 2000 2500

这应该给你你想要的所有阈值。

关于r - 条件变异 cumsum dplyr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41720141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com