在面板数据帧R

时间:2018-08-13 10:19:02

标签: r

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

     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    

在上面的示例中,由于列A中的2014年日期(条件1未得到验证),第一次观察时的虚拟值是0。在第二次观察中,该假人取值为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"))

2 个答案:

答案 0 :(得分:0)

您可以从年份开始使用库润滑和功能,以从日期开始接收年份。另请注意,如果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)

答案 1 :(得分:0)

NA有点棘手,但这是一种直接方法,将隐含条件“ 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