Почему dplyr :: filter не позволяет мне фильтровать по двум вертикалям? - PullRequest
6 голосов
/ 28 марта 2019

Я новичок в R и работаю над проектом.

My data.frame acscleantib имеет следующую форму

head(acscleantib[-3])

#       Zip        Year Total_Population Median_Income City  State                                    
#    ZCTA5 00601    2015      18088         10833    Adjun   PR    
#      ZCTA5 00602  2017      40859         16353    Agua    AB

Моя цель - понять разницу в общей численности населения между 2015 и 2017 годами.

Мой вклад:

popuinc <-  acscleantib %>% dplyr::filter(Year %in% c(2015,2017)) %>% 
    spread(Year,Total_Population) %>% group_by(Zip) %>%
    summarise(`Total2015` = sum(`2015`, na.rm = TRUE),
            `Total2017` = sum(`2017`, na.rm = TRUE)) %>% 
    mutate(Difference = Total2017- Total2015)

popuinc

#    Zip       Total2015 Total2017 Difference
#  <fct>           <int>     <int>      <int>
#1 ZCTA5 00601     17982     17599       -383
#2 ZCTA5 00602     40260     39209      -1051
#3 ZCTA5 00603     52408     50135      -2273

Я могу добиться своего результата здесь. Но как я могу добавить City в фильтр, чтобы получить окончательную мутацию вместе с соответствующими городами?

Пример желаемого вывода:

 Zip          Total2015 Total2017  Difference City
   <fct>           <int>     <int>      <int>
 1 ZCTA5 00601     17982     17599       -383    Adjunitas
 2 ZCTA5 00602     40260     39209      -1051    XYZ
 3 ZCTA5 00603     52408     50135      -2273    etc

1 Ответ

2 голосов
/ 28 марта 2019

Если я правильно понял, вы можете заменить group_by(Zip) на group_by(Zip, City)

df %>%
    filter(Year %in% c(2015,2017)) %>%
    spread(Year, Total_Population) %>%
    group_by(Zip, City) %>%
    summarise(
        Total2015 = sum(2015, na.rm = TRUE),
        Total2017 = sum(2017, na.rm = TRUE)) %>%
    mutate(Difference = Total2017 - Total2015)
## A tibble: 2 x 5
## Groups:   Zip [2]
#  Zip         City  Total2015 Total2017 Difference
#  <fct>       <fct>     <dbl>     <dbl>      <dbl>
#1 ZCTA5 00601 Adjun      2015      2017          2
#2 ZCTA5 00602 Agua       2015      2017          2

Пример данных

df <- read.table(text =
    "Zip        Year Total_Population Median_Income City  State
'ZCTA5 00601'    2015      18088         10833    Adjun   PR
  'ZCTA5 00602'  2017      40859         16353    Agua    AB", header = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...