这很令人尴尬:我承认我的几段代码与此类似:
Arghhhh!真正的程序员在看到类似的东西时会畏缩吗?
该数字应该是不言自明的: 我需要一个名为 Season 的变量,它根据WEATHERDATE列返回ID“(year-1)_(year)”。
因此,任何日期从“1998-06-15”到“1999-06-14”的行都应在季节 ID列下返回“1998-1999”。
WEATHERDATE列只是从1998-01-01运行到今天。
我打赌这有一个/两个班轮解决方案。我已经尝试了 zoo package 但没有成功。
任何R向导都指出了我在这里缺少的明显解决方案?
***可重复的例子:
WEATHERDATE <- seq(as.Date("1998-01-01"), len=99999, by=1)
VARIABLE <- rnorm(n = length(WEATHERDATE))
data_mex <- data.frame(WEATHERDATE, VARIABLE)
## how to create SEASON based on dates??
# I would then run the code block from above, something like:
data_mex <- within(data_mex, Season[DATEWEATHER >= ymd(StartOfSeason)+365*0 & DATEWEATHER < ymd(StartOfSeason)+365*1 ] <- "1998-1999")
当然,我不需要每年回来并触摸代码的解决方案是理想的:)
答案 0 :(得分:6)
您可以使用cut.Date
和seq.Date
在基础R中的两行中执行此操作:
seasons <- format(as.Date(cut.Date(as.Date(data_mex$WEATHERDATE),
breaks=seq.Date(as.Date("1997-06-15"),
as.Date("2280-06-15", "year"))), "%Y")
data_mex$seasons <- paste0(seasons, "-", as.numeric(seasons) + 1)
注意我已使用"2280-06-15"
作为您季节的最新日期,但您可能希望将其替换为Sys.Date()
,或者适合您的任务。
返回:
> head(data_mex)
WEATHERDATE VARIABLE seasons
1 1998-01-01 -0.2260734 1997-1998
2 1998-01-02 0.3222805 1997-1998
3 1998-01-03 -0.1554167 1997-1998
4 1998-01-04 -0.5591154 1997-1998
5 1998-01-05 1.0729737 1997-1998
6 1998-01-06 1.0030025 1997-1998
> tail(data_mex)
WEATHERDATE VARIABLE seasons
99994 2271-10-10 0.59986466 2271-2272
99995 2271-10-11 0.37304603 2271-2272
99996 2271-10-12 1.30822156 2271-2272
99997 2271-10-13 0.01204986 2271-2272
99998 2271-10-14 0.87340544 2271-2272
99999 2271-10-15 0.44098083 2271-2272
答案 1 :(得分:1)
以下是一个可用于获得所需输出的解决方案:
data_mex$seasonId <-
with(data_mex,
ifelse(as.numeric(format(WEATHERDATE, '%m')) >= 6 &
as.numeric(format(WEATHERDATE, '%d')) >= 15,
paste(format(WEATHERDATE, '%Y'),
as.numeric(format(WEATHERDATE, '%Y')) + 1, sep = '-'),
paste(as.numeric(format(WEATHERDATE, '%Y')) - 1,
format(WEATHERDATE, '%Y'), sep = '-')))
产生的结果是:
head(data_mex)
WEATHERDATE VARIABLE seasonId
1 1998-01-01 -0.02541724 1997-1998
2 1998-01-02 -0.48725913 1997-1998
3 1998-01-03 0.06204881 1997-1998
4 1998-01-04 -0.15207281 1997-1998
5 1998-01-05 -0.61809248 1997-1998
6 1998-01-06 -1.20427734 1997-1998
tail(data_mex)
WEATHERDATE VARIABLE seasonId
99994 2271-10-10 -0.8976144 2271-2272
99995 2271-10-11 -0.5684972 2271-2272
99996 2271-10-12 -0.8847031 2271-2272
99997 2271-10-13 -0.2659979 2271-2272
99998 2271-10-14 -0.9108352 2271-2272
99999 2271-10-15 1.1601581 2271-2272
您每次都会提取年份部分,并根据月份和日期值粘贴滞后或前导年份。 format
方法允许您提取日期的特定部分。