在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年的每个值,unnestlist列,创建一个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

Python散点图设计 - 根据其他列值为x轴选择变量的特定值

二进制位运算

MIP:添加一个变量来表示相等

为日期范围内的观察创建虚拟变量