Создайте переменную со значением один после «обработки» в году X и 0 в противном случае - PullRequest
1 голос
/ 13 октября 2019

У меня есть данные по бразильским муниципалитетам за 1995-2013 годы. Код - это идентификатор муниципалитета. Nome - это название муниципалитета, а ano - год принятия государственной политики (ноль означает, что они никогда не проводили политику).

     code                 Nome  ano
1 1100015 ALTA FLORESTA DOESTE 2010
2 1100023            ARIQUEMES 2006
3 1100031               CABIXI    0
4 1100049               CACOAL 2006
5 1100056           CEREJEIRAS 2014
6 1100064    COLORADO DO OESTE 2006

У меня следующий вопрос:

Как сгенерировать фиктивную переменную в R со значением 1 после принятия государственной политики муниципалитетом X в году Z и 0 в противном случае?

Ниже вы можете увидеть ожидаемый результат в широком формате, который легче визуализировать. (Однако я преобразую данные в длинный формат для слияния с другими данными. Как вы можете видеть, в этом примере они начинаются только после 2006 года или никогда.)

      code                      Nome 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013
1  1100015      ALTA FLORESTA DOESTE    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1    1    1    1
2  1100023                 ARIQUEMES    0    0    0    0    0    0    0    0    0    0    0    1    1    1    1    1    1    1    1
3  1100031                    CABIXI    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
4  1100049                    CACOAL    0    0    0    0    0    0    0    0    0    0    0    1    1    1    1    1    1    1    1
5  1100056                CEREJEIRAS    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
6  1100064         COLORADO DO OESTE    0    0    0    0    0    0    0    0    0    0    0    1    1    1    1    1    1    1    1

Я обнаружил похожие вопросына этом форуме, но не тот, который я спрашиваю.

1 Ответ

1 голос
/ 14 октября 2019

Вот опция, использующая tidyverse. Создайте столбец list с последовательностью от каждого значения 'ano' до 2013, unnest столбец list, создайте столбец из 1 с ('val'), сгруппированный по 'code', 'Nome', развернитенабор данных с complete для последовательности с 1995 по 2013 год, в то время как fill содержит «val» с 0, где комбинация отсутствует, ungroup и преобразует его в «широкий» формат с pivot_wider

library(dplyr)
library(tidyr) #1.0.0
library(purrr)
df1 %>%
   mutate(ano = case_when(between(ano, 1995, 2013) ~ 
        map(ano, ~ .x:2013), TRUE ~ list(NA_integer_))) %>% 
   unnest(ano) %>% 
   mutate(val = 1) %>%
   group_by(code, Nome) %>% 
   complete(ano = 1995:2013, fill = list(val = 0)) %>%
   ungroup %>% 
   filter(!is.na(ano)) %>%
   pivot_wider(names_from = ano, values_from = val)
# A tibble: 6 x 21
#     code Nome                 `1995` `1996` `1997` `1998` `1999` `2000` `2001` `2002` `2003` `2004` `2005` `2006` `2007` `2008` `2009` `2010` `2011` `2012` `2013`
#    <int> <chr>                 <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
#1 1100015 ALTA FLORESTA DOESTE      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      1      1      1      1
#2 1100023 ARIQUEMES                 0      0      0      0      0      0      0      0      0      0      0      1      1      1      1      1      1      1      1
#3 1100031 CABIXI                    0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0
#4 1100049 CACOAL                    0      0      0      0      0      0      0      0      0      0      0      1      1      1      1      1      1      1      1
#5 1100056 CEREJEIRAS                0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0
#6 1100064 COLORADO DO OESTE         0      0      0      0      0      0      0      0      0      0      0      1      1      1      1      1      1      1      1

данные

df1 <- structure(list(code = c(1100015L, 1100023L, 1100031L, 1100049L, 
1100056L, 1100064L), Nome = c("ALTA FLORESTA DOESTE", "ARIQUEMES", 
"CABIXI", "CACOAL", "CEREJEIRAS", "COLORADO DO OESTE"), ano = c(2010L, 
2006L, 0L, 2006L, 2014L, 2006L)), class = "data.frame", row.names = c(NA, 
-6L))
...