【发布时间】:2018-04-06 15:23:05
【问题描述】:
样本数据
df <- data.frame(ID1 = rep(1:1000, each= 5*365), year = rep(rep(2000:2004, each = 365), times = 1000),
day = rep(1:365, times = 1000*5),
x= runif(365*1000*5))
此数据包含一列day,它是一年中的某一天。我需要生成两列:
月份列:月份的一列(当天属于哪个月份)
-
双周栏:一天属于哪个双周。一年有24个双周。一个月内所有天数 15 是第二个双周。 例如
- 1 月 15 日是双周 1,
- 1 月 16 日至 31 日是第 2 周,
- 2 月 1 日至 15 日是第 3 周和
- 2 月 16 日至 28 日是第 4 周,以此类推。
为简单起见,我假设所有年份都是非闰年。
这是我拥有的创建两列的代码(在 RS 的帮助下)。
# create a vector of days for each month
months <- list(1:31, 32:59, 60:90, 91:120, 121:151, 152:181, 182:212, 213:243, 244:273, 274:304, 305:334, 335:365)
library(dplyr)
ptm <- proc.time()
df <- df %>% mutate(month = sapply(day, function(x) which(sapply(months, function(y) x %in% y))), # this assigns each day to a month
date = as.Date(paste0(year,'-',format(strptime(paste0('1981-',day), '%Y-%j'), '%m-%d'))), # this creates a vector of dates for a non-leap year
twowk = month*2 - (as.numeric(format(date, "%d")) <= 15)) %>% # this describes which biweek each day falls into
dplyr::select(-date)
proc.time() - ptm
user system elapsed
121.71 0.31 122.43
我的问题是运行此脚本所需的时间,我正在寻找相对更快的解决方案
编辑:为了清楚起见,我假设所有年份都必须有 365 天。在下面的答案之一中,对于 2000 年(闰年),二月有 29 天(二月的最后一天是 60,但我希望最后一天是 59),因此十二月只有 30 天(十二月从 336 开始虽然它应该以 335 开头)。我希望这很清楚。我的解决方案解决了这个问题,但需要大量时间才能运行。
【问题讨论】:
-
请参阅stackoverflow.com/questions/33967224/… 了解您的双周计算,我认为这与问题中的半个月相同
-
澄清一下,您对闰日(2 月 29 日)的期望处理方法是丢弃它们?编辑:抱歉 - 您在示例数据中没有任何闰日,明白了。
标签: r date dplyr data.table