首页 文章

R中的函数在给定时间段内创建虚拟对象

提问于
浏览
-1

有一个这样的数据框:

enter image description here

df中的前两列描述了开始日期(月份和年份)和结束日期(月份和年份) . 列名描述特定时间段的每个月份和年份 . 我需要一个函数/循环,在每个单元格中插入“1”或“0” - 当给定列名称的日期在两个第一列描述的时间段内时为“1”,否则为“0” .

我将不胜感激任何帮助 .

1 回答

  • 0

    你想做两件事 . (a)创建一个虚拟变量,(b)查看特定日期是否在一个区间内 .

    制作虚拟变量是最简单的变量,在基础R中你可以使用 ifelse . 例如,在虹膜数据框中:

    iris$dummy <- ifelse(iris$Sepal.Width > 2.5, 1, 0)
    

    现在使用日期更复杂 . 在这个答案中,我们将使用库lubridate . 首先,您需要将所有这些日期转换为'Month Year'格式,以便R能够理解 . 例如2月你可以这样做:

    new_format_february_2016 <- interval(ymd('2016-02-01'), ymd('2016-03-01') - dseconds(1))
    #[1] 2016-02-01 UTC--2016-02-29 23:59:59 UTC
    

    这是二月,即从2月1日到3月1日之前的一秒钟 . 您可以对开始日期列和结束日期列执行相同操作 .

    要比较两个时间间隔(因此,要查看特定月份是否属于其他时间间隔),您可以执行以下操作:

    int_overlaps(new_format_february_2016, other_interval)
    

    如果返回true,则两个间隔(一个特定月份和另一个间隔)重叠 . 这与另一个在另一个内部不同,但在你的情况下它会起作用 . 使用它,您可以迭代不同的列和行并构建您的虚拟变量 .

    但在此之前,我建议您清理数据,因为您当前的格式很复杂 . 为了获得R中矢量类型提供的所有功能,理想情况下,您希望每个观察一行,每列一个变量 . 您的数据框似乎不是这种情况 . 看看“R for Data Science”的“整洁数据”一章,特别是传播和收集小节:

    Tidy data

相关问题