有条件的变异cumsum dlpyr

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人.

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

在此输入图像描述

Mar*_*son 4

为此,如果您可以将数据转换为一种格式,其中每个城镇都代表距离的每个“末端”(目的地和出发地),那就更容易了。因此,我将您最后所做的更改改为Df此。请注意,它使用completefrom tidyr

\n\n
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"))\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会反转“从”关系并将其附加到列表的底部。然后,它使用complete将城镇添加为自己的“To”(例如,从 A 到 A)。最后,它将人口加入进来,但现在只需要添加一次。这是新数据:

\n\n
# 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

接下来,我们设置我们想要探索的阈值。在您的问题中,您暗示您想要使用每个唯一的成对距离。如果您更喜欢其他套件用于生产用途,只需在此处输入即可。

\n\n
radiusCuts <-\n  Df_full$Distance %>%\n  unique %>%\n  sort\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,我们构建一个命令,仅对半径内的配对城市进行求和,并在此过程中设置名称以方便稍后sum使用。summarise_

\n\n
forPops <-\n  radiusCuts %>%\n  setNames(paste("Pop within", ., "km")) %>%\n  lapply(function(x){\n    paste("sum(Population[Distance <=", x,"])")\n  })\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,我们group_byTown_From这些构造的参数传递给标准评估函数,summarise_该函数将创建以下中的每一列forPops

\n\n
Df_full %>%\n  group_by(Town_From) %>%\n  summarise_(.dots = forPops)\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n