创建与2个不同的延长日期对象之间的匹配日期对应的整数列表

时间:2017-11-16 15:56:42

标签: r dataframe dplyr plyr which

我有2个日期对象:73个日期的列表,对应于73个文件的开始日期,每个文件中有5天的数据,如下所示:

> head(fd)
[1] "1993-01-01" "1993-01-06" "1993-01-11" "1993-01-16" "1993-01-21" "1993-01-26"

然后我有一个110k +日期的大型列表,这些日期对应于不规则的非线性区间的观察,但是被归类为日期对象,如下所示:

> head(dd)
[1] "1993-01-04" "1993-01-10" "1993-01-05" "1993-01-15" "1993-01-18" "1993-01-03"

我正在尝试创建一个新的值列表,将dd中的每个值与值fd相关联,以便dd中的日期介于1993-01-01和{之间{1}}它的值为1,依此类推。编码和计算,使用循环都是低效的。我尝试使用1993-01-05函数执行此操作:

which

但是会返回警告:

i <- which(dd >= fd[-length(fd)] & dd < fd[-1])

并且不返回所需的输出。它只返回一个整数列表,这些整数对应于dd中的值,它认为是匹配的,不遵循逻辑顺序。有什么建议吗?

对于上述汇总数据集,我需要

的结果
Warning messages:
1: In `>=.default`(dd, fd[-length(fd)]) :
  longer object length is not a multiple of shorter object length
2: In `<.default`(dd, fd[-1]) :
  longer object length is not a multiple of shorter object length

因为>i [1] 1 2 1 3 4 1 中的每个日期分别对应dd中的第1,第2,第1,第3,第4和第1个日期。

匹配功能,据我所知,无法完成此操作,就好像你只是使用:

fd

您将返回一份主要是NAs的列表,其中日期不完全匹配,大约365/5个数字与i <- match(dd, fd) 中的某个日期相对应

1 个答案:

答案 0 :(得分:0)

我认为which.min就是你所追求的。尝试:

i <- sapply(dd, function(x)which.min(x > fd) - 1)

如果dd中的日期小于df中的最小日期,则它将返回0.这假设df按升序排序。我尝试使用以下值:

fd <- seq.Date(as.Date("1993-01-01"), by="5 days", length=74)
dd <- sample(seq.Date(from = min(fd), to = max(fd) - 1, by="1 day"), 
             size = 1E5, replace = TRUE)

在我相当谦虚的笔记本电脑上,耗时64秒。 BTW,“which”(和which.min)是基础R.

编辑 - 不平等当然应该是&gt;不是&gt; =。
此外,在这种情况下,fd是一个简单的序列,显然有一个更简单的解决方案:

startDate <- min(fd)
i2 <- as.integer((testSeq-startDate)/5) + 1

处理早于startDate的日期需要进行一些细微的改进。