Почему я получаю ошибку оценки, когда я вызываю эту ранее определенную переменную с помощью dplyr? - PullRequest
3 голосов
/ 23 марта 2019

Я новичок в 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 ]

1 голос
/ 23 марта 2019

Я вставил фиктивное имя столбца для отсутствующего столбца между Годом и 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
0 голосов
/ 23 марта 2019

Кажется, что при наличии двух параметров в 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 уже показал ответ без операции распространения, я оставлю это здесь

...