我有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)
中的某个日期相对应
答案 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的日期需要进行一些细微的改进。