使用dplyr调用此先前定义的变量时,为什么会收到评估错误?

时间:2019-03-23 00:45:11

标签: r dplyr tidyverse

我是R的新手,正在从事一个小项目:

Repex:

我有一个名为filterdascom4的数据集,该数据集具有以下变量

> head(filterdacsom4)
  Year       Zip Total_Population Median_Income      City State
1 2017 ZCTA5 00601            17599         11757  Adjuntas    PR
2 2017 ZCTA5 00602            39209         16190    Aguada    PR
3 2017 ZCTA5 00603            50135         16645 Aguadilla    PR
4 2017 ZCTA5 00606             6304         13387   Maricao    PR
5 2017 ZCTA5 00610            27590         18741    Anasco    PR
6 2017 ZCTA5 00612            62566         17744   Arecibo    PR

我正在尝试使用dplyr和tidyverse进行变异,并为人口与收入比率创建一个新列,然后找出哪个邮政编码在2017年具有最高的人口与收入比率

我的输入:

demograph_ratio <-  filterdacsom4 %>% dplyr::filter(Year %in% c(2017)) %>% 
  spread(Year,Median_Income) %>% group_by(Zip) %>%
  mutate(Poptoincomeratio = Total_Population/Median_Income)
demograph_ratio

但是,当我执行上述操作时,我收到一条错误消息:

Error in mutate_impl(.data, dots) : 
  Evaluation error: object 'Median_Income' not found.

这很奇怪,因为当我尝试调试它时:

filterdacsom4$Median_Income

它确实显示正确的输出:

[1]  11757  16190  16645  13387  18741  17744  14918  17157  16727  16401
  [11]  16832  17579   9632  15736  14448  16292  29160  13071  16095  20564
  [21]  12236  14966  17770  19674  16771  15401  13843  12996  14456  18032
  [31]  13416  18333  15730  14500  15315  15043  14128  18739  15918  18491
  [41]  18076  18971  14375  14487  16532  13960  18207  17489  15820  12440

为什么我会收到此错误,并且有更好的方法对此进行编码,以便根据邮政编码找到人口与收入的比率

2 个答案:

答案 0 :(得分:1)

我为Year和Zip之间的缺失列输入了一个虚拟列名,我看不出有进行散布操作的原因,于是取出来,一切似乎都可以正常工作:

demograph_ratio <-  filterdacsom4 %>% filter(Year %in% c(2017)) %>% 
      group_by(Zip) %>%
     mutate(Poptoincomeratio = Total_Population/Median_Income)

> demograph_ratio
# A tibble: 6 x 8
# Groups:   Zip [6]
   Year code    Zip Total_Population Median_Income City      State Poptoincomeratio
  <int> <fct> <int>            <int>         <int> <fct>     <fct>            <dbl>
1  2017 ZCTA5   601            17599         11757 Adjuntas  PR               1.50 
2  2017 ZCTA5   602            39209         16190 Aguada    PR               2.42 
3  2017 ZCTA5   603            50135         16645 Aguadilla PR               3.01 
4  2017 ZCTA5   606             6304         13387 Maricao   PR               0.471
5  2017 ZCTA5   610            27590         18741 Anasco    PR               1.47 
6  2017 ZCTA5   612            62566         17744 Arecibo   PR               3.53 

如果您想查看在spread操作之后为什么没有Year或Median_Income列的原因,请查看传递给mutate的“中间结果”

not_ratio <-  filterdacsom4 %>% filter(Year %in% c(2017)) %>% 
     spread(Year,Median_Income) 

> not_ratio
   code Zip Total_Population      City State  2017
1 ZCTA5 601            17599  Adjuntas    PR 11757
2 ZCTA5 602            39209    Aguada    PR 16190
3 ZCTA5 603            50135 Aguadilla    PR 16645
4 ZCTA5 606             6304   Maricao    PR 13387
5 ZCTA5 610            27590    Anasco    PR 18741
6 ZCTA5 612            62566   Arecibo    PR 17744

答案 1 :(得分:0)

spread中似乎有两个参数,Median_Income的列名更改为year的值:

demograph_ratio <-  filterdacsom4 %>% dplyr::filter(Year %in% c(2017)) %>% 
  spread(Year,Median_Income) %>% group_by(Zip)
demograph_ratio

  Zip         Total_Population City      State `2017`
  <chr>                  <dbl> <chr>     <chr>  <dbl>
1 ZCTA5 00601            17599 Adjuntas  PR     11757
2 ZCTA5 00602            39209 Aguada    PR     16190
3 ZCTA5 00603            50135 Aguadilla PR     16645
4 ZCTA5 00606             6304 Maricao   PR     13387
5 ZCTA5 00610            27590 Anasco    PR     18741
6 ZCTA5 00612            62566 Arecibo   PR     17744

由于42已经显示了答案而不进行传播操作,因此我将其保留在此处