【问题标题】:generating a dummy in a panel dataframe R在面板数据帧 R 中生成一个虚拟对象
【发布时间】:2018-08-13 10:19:01
【问题描述】:

我真的需要你的帮助。我有一个看起来像这样的面板数据框

     Name            A                  B      

   1 Marco          01/09/2014         NA    
   2 Marco          NA                 01/01/2015    
   3 Marco          02/01/2015         NA    
   4 Luca           01/01/2015         NA    
   5 Luca           NA                 31/01/2015                        
   6 Silvia         NA                 15/01/2015  

并且我想创建一个取值为 1 的虚拟变量,如果(条件 1)在 A 列中,观察结果不显示 2014 年日期或(条件 2),如果在 B 列中,观察结果显示 2015 年日期和,与此同时,该个人至少有另一个观察结果,但没有一个与 A 列中的 2014 年日期相关联。换句话说,我不知道如何为检查所有与同一个人相关的其他观察结果(在“姓名”栏中标明)。我想要的结果是这样的

         Name            A                  B                     dummy

      1  Marco          01/09/2014         NA                     0    
      2  Marco          NA                 01/01/2015             0     
      3  Marco          02/01/2015         NA                     1    
      4  Luca           01/01/2015         NA                     1     
      5  Luca           NA                 31/01/2015             1                        
      6  Silvia         NA                 15/01/2015             0    

在上面的示例中,第一次观察时虚拟变量的值为 0,因为 A 列中的日期为 2014 年(条件 1 未验证)。在第二次观察中,虚拟变量取值为 0,因为尽管 B 列中有 2015 年的日期,同一个人(Marco)在与他相关的至少一个其他观察中在 A 列中显示了 2014 年的日期(在这种情况下观察 1)。相反,观察 4 显示虚拟变量等于 1,因为 A 列中的日期是 2015 年。观察结果 5 显示虚拟变量等于 1,因为尽管 B 列中的日期是 2015 年,同一个人 (Luca) 没有其他观察结果A 列中的 2014 年日期(观察 4 中的日期为 2015 年)。最后,与 Silvia 关联的虚拟变量必须为 0,因为尽管 B 列中的日期为 2015 年,但数据框中没有其他 Silvia 的观察结果。

我希望它不是太扭曲并且我表达了我的想法。如果不清楚,请告诉我。除了条件本身,如果您帮助我将条件施加到与同一个人相关的不同观察中,那已经很有帮助了。

谢谢大家! 马可

           structure(list(Name = c("Marco", "Marco", "Marco", "Luca", 
             "Luca", 
             "Silvia"), A = structure(c(1409529600, NA, 1420156800, 
             1420070400, 
             NA, NA), class = c("POSIXct", "POSIXt"), tzone = "UTC"), B = 
             structure(c(NA, 
             1420070400, NA, NA, 1422662400, 1421280000), class = 
             c("POSIXct", 
             "POSIXt"), tzone = "UTC")), row.names = c(NA, -6L), class = 
             c("tbl_df", 
             "tbl", "data.frame"))

【问题讨论】:

  • 如果您 dput() 您的示例 data.frame 会很有帮助,这样我们就可以从您拥有的相同数据类型开始。
  • 我做到了!谢谢
  • 我上传了这个简化版本的数据框,因为在完整的版本中,我应该在这里解释许多其他事情和变量,这使得问题变得更加复杂。但是,如果您设法帮助我解决我在这个非常简单的数据框中提出的问题,我就足以处理我拥有的庞大而完整的数据集

标签: r


【解决方案1】:

NAs 使它有点棘手,但这里有一个直接的方法,将隐含条件“A 不是NA”添加到第一种情况。使用%in% 而不是== 有助于解决其他NA 问题,因为1 %in% NAFALSE,但1 == NANA

dd %>% group_by(Name) %>%
  mutate(dummy = as.integer((
      !format(A, "%Y") %in% "2014" & !is.na(A)
    ) | (
      format(B, "%Y") %in% "2015"
      & n() > 1 
      & !any(format(A, "%Y") %in% "2014")
    )
  ))
# # A tibble: 6 x 4
# # Groups:   Name [3]
#   Name   A                   B                   dummy
#   <chr>  <dttm>              <dttm>              <int>
# 1 Marco  2014-09-01 00:00:00 NA                      0
# 2 Marco  NA                  2015-01-01 00:00:00     0
# 3 Marco  2015-01-02 00:00:00 NA                      1
# 4 Luca   2015-01-01 00:00:00 NA                      1
# 5 Luca   NA                  2015-01-31 00:00:00     1
# 6 Silvia NA                  2015-01-15 00:00:00     0

【讨论】:

    【解决方案2】:

    您可以使用 library lubridate 和 function from it ye​​ar,从日期接收年份。其他请注意,如果 NA 在 if 条件下给出 NA,这就是为什么最好将 NA 转换为某些值以在 if 语句中使用。代码示例为:

        library(lubridate)
    
        Marco <- read.csv("Marcoset.csv",stringsAsFactors=F ) 
        Marco$A[is.na(Marco$A)] <- "01/01/0001"
        Marco$B[is.na(Marco$B)] <- "01/01/0001"
        Marco$A <- as.Date(Marco$A, "%d/%m/%Y")
        Marco$B <- as.Date(Marco$B, "%d/%m/%Y")
    
        Obs <-  Marco%>%
                group_by(Name)%>%
                mutate(i2014 = sign(sum(ifelse(year(A)=="2014",1,0))))%>%
                filter(year(A) !="2014" & year(A)!="0001")%>%
                select(Name, i2014)%>%
                group_by(Name, i2014)%>%
                summarise(obs=n()) 
    
          Marco <- Marco%>%
          left_join(Obs, by="Name")%>%
          mutate(dummy= ifelse(((year(A)!="2014"& year(A)!="1")|(year(B)=="2015" & obs>=2 & i2014==0)),1,0))%>%
          select(-obs, -i2014)
    

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 2017-02-02
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 2021-12-12
      相关资源
      最近更新 更多