Применение функций к отфильтрованным строкам в R - PullRequest
1 голос
/ 12 июля 2020

У меня есть длинный набор данных, в каждой строке которого указана ставка подоходного налога штата за этот год. Вот несколько строк в качестве примера:

State   statefip year  TopRate
  <chr>      <dbl> <fct>   <dbl>
1 Alabama        1 2018     0.05
2 Alabama        1 2017     0.05
3 Alabama        1 2016     0.05
4 Alabama        1 2015     0.05
5 Alabama        1 2014     0.05
6 Alabama        1 2013     0.05
7 Alabama        1 2012     0.05
8 Alabama        1 2011     0.05
9 Alabama        1 2010     0.05
10 Alaska         2 2018     0   

Я хотел бы создать дополнительный столбец, который является квантилем (0,5, 0,75, 0,80 и т. Д.) Для каждого года. Таким образом, столбец 0,5 (медиана) будет иметь медианную ставку налога для всех штатов в 2018 году и так далее для каждого года. Чтобы уточнить, каждое наблюдение для данного штата в 2018 году будет иметь одинаковую ставку налога для 0,5, но они будут меняться каждый год. Хотя это может показаться странным, это поможет мне, когда мне придется объединить эти данные с другими данными, которые у меня будут позже. Заранее благодарим за любую помощь!

Изменить: вот что я хочу ...

State   statefip year  TopRate median     q3    q80    q85    q90 jenkb$jenkb
   <chr>      <dbl> <fct>   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>       <int>
 1 Alabama        1 2018     0.05 0.0575 0.0700 0.074  0.0888 0.0897           0
 2 Alabama        1 2017     0.05 0.0575 0.0700 0.074  0.0854 0.0895           0
 3 Alabama        1 2016     0.05 0.0575 0.0700 0.074  0.0854 0.0895           0
 4 Alabama        1 2015     0.05 0.0575 0.0700 0.074  0.0888 0.0897           0
 5 Alabama        1 2014     0.05 0.058  0.07   0.0765 0.0888 0.0897           0
 6 Alabama        1 2013     0.05 0.0599 0.072  0.0775 0.0839 0.0895           0
 7 Alabama        1 2012     0.05 0.06   0.072  0.0775 0.0866 0.0895           0
 8 Alabama        1 2011     0.05 0.06   0.0738 0.078  0.085  0.0897           0
 9 Alabama        1 2010     0.05 0.06   0.0738 0.078  0.0872 0.0897           1
10 Alaska         2 2018     0    0.0575 0.0700 0.074  0.0888 0.0897           0
# ... with 449 more rows

За исключением того, что я хочу, чтобы столбец JenkB был 1 за каждый год, когда состояние попадает во вторую корзину для перерыва Дженкса для данного года.

taxlong %>%
  group_by(year) %>% 
  mutate(median = quantile(TopRate, .5)) %>%
  mutate(q3 = quantile(TopRate, .75)) %>%
  mutate(q80 = quantile(TopRate, .80)) %>%
  mutate(q85 = quantile(TopRate, .85)) %>%
  mutate(q90 = quantile(TopRate, .90)) #%>%
  #mutate(jenkb = as.integer((TopRate > 0.0323 & year == 2018 | 2017 | 2015) | (TopRate > 0.0375 & year == 2016) | (TopRate > 0.034 & year == 2014 | 2013 | 2012 | 2011 | 2010)))

Этот код не работал

Ответы [ 2 ]

3 голосов
/ 12 июля 2020

Мы можем использовать quantile с cut для создания столбца после группировки по столбцам группы «год»

library(dplyr)
df1 %>%
    group_by( year) %>% 
    mutate(new = cut(TopRate, breaks = c(-Inf, quantile(TopRate, 
            probs = c(.5, .75, .8) ), Inf)))

Если мы хотим создать новые столбцы со значениями quantile (значения будут повторяется для каждой строки), поместите его в list, а затем unnest в «широкий» формат

library(tidyr)
df1 %>% 
   group_by(year) %>%
   mutate(new = list(quantile(TopRate, probs = c(.5, .75, .8)))) %>% 
   unnest_wider(c(new))

Или с data.table

library(data.table)
setDT(df1)[, new := cut(TopRate, breaks = c(-Inf, quantile(TopRate, probs = c(.5, .75, .8)), Inf)), .( year)]
1 голос
/ 12 июля 2020

спасибо за вашу помощь.

taxlong %>%
  group_by(year) %>% 
  mutate(median = quantile(TopRate, .5))

работает отлично, я просто повторю процесс для каждого из необходимых мне квантилей. Мне нужно сохранить значения для моего последующего анализа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...