【问题标题】:Make indicator for date using `timeDate`使用`timeDate`制作日期指示器
【发布时间】:2018-03-19 20:46:57
【问题描述】:

我有许多日期,我想为其创建一个指标变量。问题是我很难使用timeDateR 中实现这一点。这是一个玩具示例

library(timeDate)
library(lubridate)
library(tidyverse)

>df <- tribble(
  ~date,
  "2010-12-31",
  "2011-01-01",
  "2011-01-02") %>% 
  mutate(date = ymd(date))

> df
# A tibble: 3 x 1
  date      
  <date>    
1 2010-12-31
2 2011-01-01
3 2011-01-02

我想为元旦添加一个指标is_new_year

我尝试了以下

df %>% rowwise() %>% 
  mutate(is_new_year = ifelse(USNewYearsDay(year = year(date)) == date,1,0))

得到了错误

mutate_impl(.data, dots) 中的错误:评估错误:比较 (1) 仅适用于原子类型和列表类型。

我该怎么做才能得到

  date          is_new_year
  <date>         <int>
1 2010-12-31       0
2 2011-01-01       1
3 2011-01-02       0

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是一个解决方案:

    # dummy dates 
    x <- seq(as.Date("1900-01-01"), as.Date("2018-12-31"), by = "day")
    # first date of year
    first <- subset(x, format(as.Date(x),"%m")==12 & format(as.Date(x),"%d")==31)+1
    # find if df dates == first date of year 
    find <- df$date %in% first
    df$find <- ifelse(find == TRUE,1,0)
    
    df
    

    输出:

    > df
    # A tibble: 3 x 2
      date        find
      <date>     <dbl>
    1 2010-12-31  0   
    2 2011-01-01  1.00
    3 2011-01-02  0  
    

    【讨论】:

      【解决方案2】:
       df%>%mutate(is.newyear=as.numeric(as.Date(paste0(year(date),"-1-1"))==date))
      # A tibble: 3 x 2
              date is.newyear
            <date>      <dbl>
      1 2010-12-31          0
      2 2011-01-01          1
      3 2011-01-02          0
      

      【讨论】:

      • 这确实适用于这个例子,但我计划使用timeDate 包,因为我想看看很多假期。
      • timeDate 类似于holidays 包吗?
      • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多