【问题标题】:Creating a dummy/indicator variable that references date variables from two different data frames创建一个虚拟/指标变量,该变量引用来自两个不同数据帧的日期变量
【发布时间】:2021-08-09 19:04:33
【问题描述】:

我的问题很基本,但我是 R 新手,我已经尝试解决这个问题几天了,但没有任何成功:(

我在做什么

这是 CoronaNet_cleaned 数据框。

country       date_start  date_end  
South Africa  2020-03-22  NA
South Africa  2020-04-12  2020-06-02
Australia     2021-02-11  2020-04-12
Australia     2020-06-10  NA 
United States 2020-01-01  NA  
United States 2020-12-08  NA

这是 tweetgovuser 数据框

country        screen_name  created_at   text                 
South Africa   HealthZA     2020-12-08   The number of health care workers....
...

我想要什么

我想在 tweetgovuser 中创建一个名为 lockdown_dummy 的列。我希望根据三个条件创建此指标/虚拟变量:

  • 如果 created_at (tweetgovuser) 匹配 date_startdate_end (CoronaNet_cleaned),让 lockdown_dummy (在 tweetgovuser 中) = 1
  • 如果 created_at 介于 date_enddate_start 的日期之间,则令 lockdown_dummy = 1
  • 如果以上条件都不成立,则设 lockdown_dummy = 0

最终产品应如下所示:

country        screen_name  created_at   text             lockdown_dummy      
South Africa   HealthZA     2020-12-08   The number....   1
...

我尝试过的

我尝试了几个不同的代码块,但最近我写了这个非常粗糙且写得很糟糕的代码来执行这个:

  lockdown_dummy <- case_when(
  created_at == date_start ~ 1,
  created_at == date_end ~ 1, 
  "date_start" %<% created_at %<% "date_end" ~ 1
  TRUE ~ 0
  )

【问题讨论】:

    标签: r date dplyr conditional-statements dummy-variable


    【解决方案1】:

    好问题。下次尝试多分享一些导入代码的数据,方便我们做实验。为此,您可以使用 dput() 之类的函数。

    在您的情况下,首先要做的是连接这两个表。这里我使用了left_join()

    然后,您只需要调用ifelse() 来检查日期是否高于开始日期并小于结束日期。

    代码如下:

    library(tidyverse)
    library(lubridate)
    
    CoronaNet_cleaned = read.table(header=T, text="
    country       date_start  date_end  
    'South Africa'  2020-03-22  NA
    'South Africa'  2020-03-22  2027-03-22
    'South Africa'  2020-04-12  2020-06-02
    Australia     2021-02-11  2020-04-12
    Australia     2020-06-10  NA 
    'United States' 2020-01-01  NA  
    'United States' 2020-12-08  NA")
    
    tweetgovuser  = read.table(header=T, text="
    country        screen_name  created_at   text                 
    'South Africa'   HealthZA     2020-12-08   'The number of health care workers'                
    ")
    
    CoronaNet_cleaned %>% 
      left_join(tweetgovuser, by="country") %>% 
      mutate(
        date_start = ymd(date_start),  #probably not needed with real data
        date_end = ymd(date_end),      #probably not needed with real data
        created_at = ymd(created_at),  #probably not needed with real data
        dummy = ifelse(created_at>=date_start & created_at<=date_end, 1, 0),
      )
    #> # A tibble: 7 x 7
    #>   country    date_start date_end   screen_name created_at text             dummy
    #>   <chr>      <date>     <date>     <chr>       <date>     <chr>            <dbl>
    #> 1 South Afr~ 2020-03-22 NA         HealthZA    2020-12-08 The number of h~    NA
    #> 2 South Afr~ 2020-03-22 2027-03-22 HealthZA    2020-12-08 The number of h~     1
    #> 3 South Afr~ 2020-04-12 2020-06-02 HealthZA    2020-12-08 The number of h~     0
    #> 4 Australia  2021-02-11 2020-04-12 <NA>        NA         <NA>                NA
    #> 5 Australia  2020-06-10 NA         <NA>        NA         <NA>                NA
    #> 6 United St~ 2020-01-01 NA         <NA>        NA         <NA>                NA
    #> 7 United St~ 2020-12-08 NA         <NA>        NA         <NA>                NA
    

    reprex package (v1.0.0) 于 2021-05-20 创建

    【讨论】:

    • 如果有帮助,这里是实际数据:drive.google.com/drive/folders/…
    • 非常感谢您抽出宝贵的时间来写这篇文章。我可以看到您按“国家”加入表格。但是发生的情况是,在输出中,对于下面的列,它最终看起来像这样:imgur.com/a/S1Mnawq 将引用 2021 年 3 月 14 日某事的行与另一个在 3 月 18 日之间的行连接起来是没有意义的和 2020 年 4 月 16 日。这是否意味着我应该按日期和国家加入???
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2021-09-13
    • 2021-11-08
    • 2016-10-21
    相关资源
    最近更新 更多