我被困在试图创建一个代码,从一个给定的开始日期开始,跨越多年的日期向量过滤连续5天。
示例:
v = seq.Date(as.Date("2000-01-01"), as.Date("2020-12-31"), 1)
initial_date = as.Date("01-01") #(mm:dd)
预期输出:
2000-01-01 #(YYYY:mm:dd)
2000-01-02
2000-01-03
2000-01-04
2000-01-05
2001-01-01
2001-01-02
2001-01-03
2001-01-04
2001-01-05
...
2020-01-01
2020-01-02
2020-01-03
2020-01-04
2020-01-05
例如,如果初始日期为12-31(mm:dd),则结果应为:
2000-12-31
2001-01-01
2001-01-02
2001-01-03
2001-01-04
2001-31-12
2002-01-01
2002-01-02
2002-01-03
2002-01-04
...
2019-12-31
2020-01-01
2020-01-02
2020-01-03
2020-01-04
2020-12-31
有什么建议吗?
4条答案
按热度按时间rjee0c151#
您可以使用
str_detect()
查找起始值,并使用索引查找接下来的4行。输出:
jjjwad0x2#
(v-z) %in% v
是必需的,因为否则它将“匹配”不在原始v
中的1999-12-31
format(v-z, format = "%m-%d")
检查z
天前(对于v
中的所有)是否与initial_date
匹配sapply
的返回值是一个length(v)
-行,5-列的逻辑矩阵,其中每行指示是否应该保留该行的第v
(在initial_date
的5天内)。为了确定一行中是否有任何为真,我们使用rowSums(.) > 0
,它将返回一个logical
向量,其长度与v
相同。注意事项:我尝试使用
outer(v, 0:4,
-)
一次性完成这一点,但R中的矩阵不倾向于保留"Date"
类,因此需要解决这个问题(虽然可以做到)有点麻烦。解决方案是生成一个不是类的矩阵作为日期,因此在sapply
内进行比较。我试图尽可能减少“循环”的数量,因此迭代0:4
而不是v
。t9aqgxwy3#
此函数使用
strftime(format = "%m-%d")
来比较日期,同时忽略年份,然后将0
到n - 1
天添加到每个匹配的日期,然后将结果子集显示在原始日期向量中。kzmpq1sx4#
试试看