我如何使用dplyr查找按年份和邮政编码划分的人口差异?

我如何使用dplyr查找按年份和邮政编码划分的人口差异?,r,dplyr,R,Dplyr,我正在处理ACS数据,我已经使用dplyr包将我的数据过滤到这个位置。然而,我正在尝试使用dplyr中的mutate来查找2013年至2016年总人口的增长和减少情况(基于邮政编码)。例如,我想创建一个新列,为zip 43001查找2013年至2016年总人口的差异 我的意见: filterdacs_D1 <- mutate(filename,difference1 =$zip$total_population[total_population]-$zip$total_population

我正在处理ACS数据,我已经使用dplyr包将我的数据过滤到这个位置。然而,我正在尝试使用dplyr中的mutate来查找2013年至2016年总人口的增长和减少情况(基于邮政编码)。例如,我想创建一个新列,为zip 43001查找2013年至2016年总人口的差异

我的意见:

filterdacs_D1 <- mutate(filename,difference1 =$zip$total_population[total_population]-$zip$total_population2017)

如何在R中实现这一点?

对于这样的问题,有很多帮助,但我可能会这样攻击它:

library(tidyverse)

zips <- tibble::tribble(
    ~Year,          ~Zip, ~Total_Population, ~Median_Income,                 ~City,
     2013, "ZCTA5 43001",              2475,          87333,    "Alexandria    OH",
     2013, "ZCTA5 43002",              2753,          83873,  "Amlin           OH",
     2014, "ZCTA5 43003",              2366,          46691,   "Ashley         OH",
     2014, "ZCTA5 43001",             24625,          70809, "Blacklick        OH",
     2014, "ZCTA5 43005",               155,          43810,   "Bladensburg    OH",
     2015, "ZCTA5 43006",               705,          45673,    "Brinkhaven    OH",
     2015, "ZCTA5 43001",              2430,          28422,  "Buckeye Lake    OH",
     2016, "ZCTA5 43009",              2036,          62188,         "Cable    OH",
     2016, "ZCTA5 43010",               386,          34625,       "Catawba    OH",
     2016, "ZCTA5 43001",              7733,          66548,    "Centerburg    OH"
    )

diff <-  zips %>% dplyr::filter(Year %in% c(2013,2016)) %>% 
    spread(Year,Total_Population) %>% group_by(Zip) %>%
    summarise(`Total2013` = sum(`2013`, na.rm = TRUE),
              `Total2016` = sum(`2016`, na.rm = TRUE)) %>% 
    mutate(Difference = Total2013- Total2016)

diff
库(tidyverse)
拉链%
传播(年,总人口)%>%按(Zip)分组%>%
总结(`Total2013`=sum(`2013`,na.rm=TRUE),
`Total2016`=总和(`2016`,na.rm=TRUE))%>%
变异(差异=2013年总计-2016年总计)
差异

你必须把你的问题分解成更小的部分,而不是试图认为只有一个函数可以完成你想要的任务。

在你的代码中,你提到了一些与你显示的数据不匹配的事情:你的人口列被命名为“Total_population”,而不是“population”,并且你曾经拼错了“population”。你有
$zip$population
,这也没有意义-我不确定
$zip
应该在那里做什么。最简单的方法可能就是使用
tidyr::spread
为每个year@camille谢谢,我已经编辑了上面的内容,但仍然不对。R区分大小写,因此
total_population!=总人口
。看看
groupby
,但是如果没有真正的分类,我们就不能做更多了。@camille如果我每年都做专栏,我该如何考虑邮政编码?因为我正在寻找基于邮政编码的数据,例如2016年至2013年,10个邮政编码的总人口下降幅度最大。我是R的新手。感谢您的见解。此外,如果您试图将原始数据帧放入tibble::tribble()中,我尝试使用zips,但它不会起作用。只需复制tible::tribble()语句之后的所有内容,并在原始dataframe.Correct上运行它。但我面临的问题是,dataset有50个邮政编码,并且并非所有数据都会在控制台中同时显示,因此我无法粘贴所有数据并使用tibble()执行上述操作。我可以每次过滤并使用10个邮政编码,但我想知道是否有更有效的方法使用如此大的数据框架来处理和处理数据。如果您已经拥有数据框架形式的数据,您可以跳过tribble部分,然后从这里开始
diff%dplyr::filter(Year%in%c(20132016))%>%spread(年,总人口)%%>%按(Zip)分组%>%总结(`Total2013`=sum(`2013`,na.rm=TRUE),`Total2016`=sum(`2016`,na.rm=TRUE))%%>%变异(差异=Total2013-Total2016)差异
library(tidyverse)

zips <- tibble::tribble(
    ~Year,          ~Zip, ~Total_Population, ~Median_Income,                 ~City,
     2013, "ZCTA5 43001",              2475,          87333,    "Alexandria    OH",
     2013, "ZCTA5 43002",              2753,          83873,  "Amlin           OH",
     2014, "ZCTA5 43003",              2366,          46691,   "Ashley         OH",
     2014, "ZCTA5 43001",             24625,          70809, "Blacklick        OH",
     2014, "ZCTA5 43005",               155,          43810,   "Bladensburg    OH",
     2015, "ZCTA5 43006",               705,          45673,    "Brinkhaven    OH",
     2015, "ZCTA5 43001",              2430,          28422,  "Buckeye Lake    OH",
     2016, "ZCTA5 43009",              2036,          62188,         "Cable    OH",
     2016, "ZCTA5 43010",               386,          34625,       "Catawba    OH",
     2016, "ZCTA5 43001",              7733,          66548,    "Centerburg    OH"
    )

diff <-  zips %>% dplyr::filter(Year %in% c(2013,2016)) %>% 
    spread(Year,Total_Population) %>% group_by(Zip) %>%
    summarise(`Total2013` = sum(`2013`, na.rm = TRUE),
              `Total2016` = sum(`2016`, na.rm = TRUE)) %>% 
    mutate(Difference = Total2013- Total2016)

diff