在 X 年的 "treatment" 之后创建一个值为 1 的变量,否则为 0
Create a Variable with value one after "treatment" in year X, and 0 otherwise
我有一个包含 1995-2013 年的巴西城市的面板数据。代码是市政 ID。 Nome 是自治市名称,ano 是采用 public 政策的年份(零表示他们从未实施过该政策。)
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
我有以下问题:
在 Z 年 X 市采用 public 政策后,如何在 R 中生成值为 1 的虚拟变量,否则为 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
我在这个论坛上发现了类似的问题,但不是我要问的问题。
这是一个使用 tidyverse
的选项。创建一个 list
列,序列从 'ano' 的每个值到 2013,unnest
list
列,创建一列 1s ('val'),分组依据'code'、'Nome',用 complete
扩展数据集,用于 1995 年到 2013 年的序列,而 fill
将 'val' 设为 0,其中组合不存在, ungroup
并使用 pivot_wider
将其重塑为 'wide' 格式
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))
我有一个包含 1995-2013 年的巴西城市的面板数据。代码是市政 ID。 Nome 是自治市名称,ano 是采用 public 政策的年份(零表示他们从未实施过该政策。)
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
我有以下问题:
在 Z 年 X 市采用 public 政策后,如何在 R 中生成值为 1 的虚拟变量,否则为 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
我在这个论坛上发现了类似的问题,但不是我要问的问题。
这是一个使用 tidyverse
的选项。创建一个 list
列,序列从 'ano' 的每个值到 2013,unnest
list
列,创建一列 1s ('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))