在X年“处理”后创建一个值为1的变量,否则为0
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在X年“处理”后创建一个值为1的变量,否则为0相关的知识,希望对你有一定的参考价值。
我有一个包含1995-2013年的巴西市政当局的面板数据。代码是市政ID。 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
我有以下问题:
在市X于X年采用公共政策后,如何在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))
以上是关于在X年“处理”后创建一个值为1的变量,否则为0的主要内容,如果未能解决你的问题,请参考以下文章
查找链表中是否存在一个值为x的节点,若存在,则删除节点并返回1,否则返回0
查找链表中是否存在一个值为x的节点,若存在,则删除节点并返回1,否则返回0