【发布时间】:2021-05-06 05:36:47
【问题描述】:
我正在寻找实现创建新变量numWithin365的最佳方法,定义如下:
给定一列日期,dates,计算该列中在前 365 天内其他日期的数量。 这个问题可以推广到日期向量之外。
这是一种实现;我正在寻找任何可以帮助它更好地扩展的建议。
library(dplyr)
# set seed for reproducibility
set.seed(42)
# function to calculate number of dates in prior year
within365 <- function(col){
sapply(col, function(x){
sum(x-365 < col & col <= x-1)
}
)
}
# fake data sorted chronologically
df <- data.frame(dates = sample(seq(as.Date('2015/01/01'), as.Date('2020/12/31'),
by="day"), 10)) %>% arrange(dates)
# applying the function
df %>% mutate(numWithin365 = within365(dates))
dates numWithin365
1 2015-12-22 0
2 2016-09-25 1
3 2018-01-02 0
4 2018-02-25 1
5 2018-03-22 2
6 2018-06-05 3
7 2018-08-19 4
8 2019-06-13 1
9 2020-09-02 0
10 2020-09-27 1
【问题讨论】:
-
这是我无意的,但我认为可以利用排序并仅检查“之前”的日期。
-
@Dries 您可以使用(现在相当标准的)
data.tablenon-equi join 并使用by = .EACHI聚合匹配项。d[ , from := dates - 365];d[d, on = .(dates < dates, dates >= from), .N, by = .EACHI]。我把它留给你的 google-fu 在 SO 上找到类似的帖子(有很多)。 -
@Henrik 为什么需要包含
on?我很难在 wiki 中找到它。 -
data.table连接上还没有(官方)小插图。所以请参考?data.table和on参数 - 使用on指定要连接的变量,对于非等值连接还有二元运算符,如<和>=。另请参阅同一帮助页面上的几个示例。干杯 -
@Henrik 您应该添加您的解决方案作为答案。放大后,它几乎与 C++ 解决方案一样快。
标签: r date optimization dplyr