首页 > 解决方案 > 格式化日期并为日期创建虚拟变量

问题描述

来自一位经验不足的程序员的问题.. 我正在尝试创建虚拟变量来指示问题是否在 2008 年 9 月 15 日(金融危机)之后。我的数据集的日期格式如下:15-09-2008。由于 R 将变量识别为字符,因此我尝试通过运行以下代码将其转换为日期:

c$NewDate <- strptime(c$IssueDate, "&d-&m-&Y")

format(c$NewDate, "&Y/&m/&d")

但是,上面的代码已经导致变量 c$NewDate 只返回 NA,而数据帧 c 中根本没有 NA。我真的不明白它来自哪里。

正如我所说,我的主要目标是创建虚拟变量。我已经在 dd-mm-yy 格式中尝试了以下代码:c$GFC <- ifelse(c$IssueDate > as.Date("15-09-2008", origin = "10-01-1986"), 0, 1),但这不起作用。它表示 1986 年 1 月 1 日发行的 1 和 1986 年 1 月 24 日发行的 0。因此,这根本没有意义。如果有比这更快的方法来创建指示问题是否在 2008 年 9 月 15 日之后出现的虚拟对象,我也很想知道!

图片显示出了什么问题

图片显示出了什么问题

标签: rspecial-charactersdate-formatting

解决方案


我强烈推荐tidyverseandlubridate来处理这个问题。


library(tidyverse)
library(lubridate)

# generate the test data
temp <- data.frame(mytime = c("14-09-2008", "13-5-2021"))


temp <- 
  temp %>%
  
  # create a "tibble" object which can be operated by tidyverse package
  as_tibble() %>%
  
  # transform the format from a character into a date
  mutate(mytime = dmy(mytime)) %>%
  
  # generate indicators
  mutate(indicator = mytime <= dmy("15-09-2008") )

或者你只使用lubridate包:</p>

> temp$mytime
[1] "14-09-2008" "13-5-2021" 
> date_format <- dmy(temp$mytime)
> date_format
[1] "2008-09-14" "2021-05-13"
> ifelse(date_format <= dmy("15-09-2008"), 1, 0)
[1] 1 0

推荐阅读