r - 在间隔内匹配星期几以创建特定日期
问题描述
我正在使用具有以下日期结构的数据集:
Week DateStart DateEnd Day
1 5-Aug-16 11-Aug-16 Monday
2 12-Aug-16 18-Aug-16 Thursday
其中“Week”对应于研究周数,“DateStart”和“DateEnd”是该周的第一天和最后一天,“Day”表示该周内的特定日期。我想使用“DateStart”、“DateEnd”和“Day”字段来创建一个新字段“Date”,它为“DateStart”和“DateEnd”内的每个“Day”分配一个特定日期间隔。
我使用 %--% 运算符将 DateStart 和 DateEnd 转换为间隔:
Week_Interval <- DateStart %--% DateEnd
但是后来我在弄清楚如何将 Day 字段与结果间隔内的日期匹配时运气不佳。我已经尝试通读 lubridate 文档,但其中似乎没有任何东西可以专门解决我的问题。我希望这里的人可能对此有一些经验,并可以帮助我指出正确的方向。
我理想的输出是这样的:
Week DateStart DateEnd Day Date
1 5-Aug-16 11-Aug-16 Monday 08-08-2016
2 12-Aug-16 18-Aug-16 Thursday 18-08-2016
日期遵循标准 dd-mm-yyyy 格式。
解决方案
取一周中星期几Day
和DateStart
模 7 之间的差并将其添加到DateStart
.
不使用任何包。
dow <- c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
transform(DF, Date =
DateStart + (match(Day, dow) - 1 - as.POSIXlt(DateStart)$wday) %% 7)
给予:
Week DateStart DateEnd Day Date
1 1 2016-08-05 2016-08-11 Monday 2016-08-08
2 2 2016-08-12 2016-08-18 Thursday 2016-08-18
注1
如果您在英语语言环境中,则可以替代写出星期几:
dow <- weekdays(as.Date("1950-01-01") + 0:6)
笔记2
在示例中,两行的开始日期都是星期五。如果知道情况总是如此,我们可以通过将代码硬编码为 5 来缩短代码:
transform(DF, Date = DateStart + (match(Day, dow) - 1 - 5) %% 7)
注3
输入,以可重现的形式,是:
Lines <- "Week DateStart DateEnd Day
1 5-Aug-16 11-Aug-16 Monday
2 12-Aug-16 18-Aug-16 Thursday"
DF <- read.table(text = Lines, header = TRUE)
fmt <- "%d-%b-%y"
DF <- transform(DF, DateStart = as.Date(DateStart, fmt),
DateEnd = as.Date(DateEnd, fmt))
推荐阅读
- c# - 消息:订阅验证请求失败。通知端点必须以 200 OK 响应验证请求
- android - 从 android 中的 SevenZip 库的选定文件路径中获取 archiveFile 名称
- python - 用平均值替换每行的最大值
- node.js - 跨服务器的 TestCafe 负载平衡命令
- nestjs - NestJs 一个具有关系的 Post 请求
- python - 如何在python中映射另一列的值
- batch-file - 批处理文件 IF 命令未正确评估
- snowflake-cloud-data-platform - 是否可以创建数据交换并与读者帐户共享?
- javascript - 通过循环键数组创建两个或多个 S3 预签名 URL?
- python - 在 ROS 模拟中使用 OpenCV 尝试 KLT 时的问题