我正在寻找实现创建新变量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
data.table
非等值连接,并使用by = .EACHI
聚合匹配项。d[ , from := dates - 365]
;d[d, on = .(dates < dates, dates >= from), .N, by = .EACHI]
。我让您自行利用谷歌搜索在 SO 上找到类似的帖子(那里有大量的相关帖子)。 - Henrikdata.table
没有(官方的)vignette 关于 joins 的说明。因此,请参考?data.table
和on
参数 - 通过on
参数,您可以指定要加入的变量,并且对于非等值连接还可以使用二元运算符,如<
和>=
。在同一帮助页面上还有几个示例。干杯! - Henrikcol <= x - 1
替换为col < x
以去除不必要的减法操作。Henrik 和 Roland 的解决方案更快,所以如果你实际上处于性能受损的情况(请不要进行过早的优化...),值得考虑他们的方案。但你的解决方案足够快,同时易于阅读,不需要大量内存和额外的依赖。有时候这些东西值得放弃一些性能。 - anjama