【问题标题】:turn date into dummies for days of month and month of year将日期转换为月份和年份月份的虚拟日期
【发布时间】:2018-12-24 19:19:58
【问题描述】:

我有一个这样的日期向量:

ds <- lubridate::as_date(c("2015-11-23", "2015-11-24", "2015-11-25", 
     "2015-11-26", "2015-11-27", "2015-11-30", "2015-12-01", "2015-12-02",
                           "2015-12-03", "2015-12-04"))

此向量包含按升序排列的日期,但在某些日期之间缺失。在此示例中,例如,11 月 28 日和 11 月 29 日缺失。

我现在想把这些日期变成假人。

一个假人应该只是月份,另一个假人应该指出每个月内的位置。在上面的例子中,2015 年 11 月的第一个观测值是 2015 年 11 月 23 日。

在这种情况下,结果将是:

df <- data.frame(November = c(1, 1, 1, 1, 1, 1, 0 ,0 ,0 ,0),
                 December = c(0, 0, 0, 0, 0, 0, 1 ,1 ,1 ,1),
                 d1 = c(1, 0,0,0,0,0,1,0,0,0),
                 d2 = c(0, 1,0,0,0,0,0,1,0,0),
                 d3 = c(0, 0,1,0,0,0,0,0,1,0),
                 d4 = c(0, 0,0,1,0,0,0,0,0,1),
                 d5 = c(0, 0,0,0,1,0,0,0,0,0),
                 d6 = c(0, 0,0,0,0,1,0,0,0,0)) 

> df
   November December d1 d2 d3 d4 d5 d6
1         1        0  1  0  0  0  0  0
2         1        0  0  1  0  0  0  0
3         1        0  0  0  1  0  0  0
4         1        0  0  0  0  1  0  0
5         1        0  0  0  0  0  1  0
6         1        0  0  0  0  0  0  1
7         0        1  1  0  0  0  0  0
8         0        1  0  1  0  0  0  0
9         0        1  0  0  1  0  0  0
10        0        1  0  0  0  1  0  0

d1 表示此特定月份的首次观察日期。 请注意,它应该推广到多年。

我尝试的是这样的:

nov <- ds[months(ds) == 'November']

d1 <- ifelse(ds %in% nov & ds == dplyr::first(nov), 1, 0 )

【问题讨论】:

  • 到目前为止你尝试了什么?
  • @mondano 我添加了我的尝试,但它们没有成功并且没有概括
  • 你可能想看看model.matrix;但我的问题是为什么你想这样做?
  • 这是一个奇怪的结构。你想达到什么目的?
  • @MauritsEvers 我不希望每个约会都有一个假人,只是我描述的方式的假人。

标签: r date lubridate dummy-variable


【解决方案1】:

如果我理解正确的话,OP 希望为每个月以及按出现顺序的事件创建虚拟变量。

这可以使用data.table 包中的dcast()rowid() 函数来解决:

ds <- lubridate::as_date(c("2015-11-23", "2015-11-24", "2015-11-25", 
                           "2015-11-26", "2015-11-27", "2015-11-30", "2015-12-01", "2015-12-02",
                           "2015-12-03", "2015-12-04"))

library(data.table)
tmp <- data.table(ds)[, month := format(ds, "%Y-%m")]
dcast(tmp, ds ~ month, length, value.var = "ds")[
  dcast(tmp, ds ~ sprintf("d%02i", rowid(month)), length, value.var = "ds"),
  on = "ds"][, -"ds"]
    2015-11 2015-12 d01 d02 d03 d04 d05 d06
 1:       1       0   1   0   0   0   0   0
 2:       1       0   0   1   0   0   0   0
 3:       1       0   0   0   1   0   0   0
 4:       1       0   0   0   0   1   0   0
 5:       1       0   0   0   0   0   1   0
 6:       1       0   0   0   0   0   0   1
 7:       0       1   1   0   0   0   0   0
 8:       0       1   0   1   0   0   0   0
 9:       0       1   0   0   1   0   0   0
10:       0       1   0   0   0   1   0   0

说明

将日期向量转换为 data.table 对象,其中添加了一个列,该列以明确的格式 (ISO 8601) 表示年和月。

然后,dcast() 被调用两次:(1) 为每个月创建虚拟变量,(2) 为事件创建虚拟变量。 rowid(month) 按每月出现的顺序计算事件。 sprintf() 用于格式化列标题,以 0 开头,以防每月发生超过 9 个事件。

dcast() 的每次调用都会创建最终解决方案的一部分。这两个部分通过在日期上加入来组合。最后,ds 被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2021-04-09
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多