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

时间:2018-01-15 10:54:49

标签: r function loops period dummy-variable

有一个这样的数据框:

enter image description here

df中的前两列描述了开始日期(月份和年份)和结束日期(月份和年份)。列名描述特定时间段的每个月份和年份。 我需要一个功能/循环,以及#34; 1"或" 0"在每个细胞中 - " 1"当给定列名称的日期在两个第一列描述的时间段内时," 0"如果不。

我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:0)

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

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

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

现在处理日期更复杂。在这个答案中,我们将使用库lubridate。首先,您需要将所有这些日期转换为R可以理解的格式“月份年”。例如二月你可以这样做:

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