我从以下问题开始,寻求一般性:if statement with dates in R
df <- data.frame(date = as.Date(c("16.04.2015", "04.08.2014", "11.09.2013",
"20.11.2015", "04.04.2014"), '%d.%m.%Y'))
我想确定07-15(%m-%d)和12-31之间的所有日期,例如
> date value
> 16.04.2015 0
> 04.08.2014 1
> 11.09.2013 1
> 20.11.2015 1
> 04.04.2014 0
我的解决方案基于@rawr在上述问题中发布的解决方案:
间隔功能:
`%between%` <- function(x, interval) x >= interval[1] & x <= interval[2]
所有可能的开头向量:
begi <- as.Date(sprintf('%s-07-15',1993:2018))
# Vector with all the possible intervals
dates <- as.Date(c(sprintf('%s-07-15',1993:2018), sprintf('%s-12-31',1993:2018)))
使用功能循环
df$value <- NA
for (i in length(begi)) {
ind<-which(format(df$date,"%Y") == format(begi[i], "%Y"))
df$value[ind] <- 1*(df$date[ind] %between% as.Date(c(begi[i],
dates[i+length(begi)])))
}
如果我逐个运行i
,则会得到想要的结果。但是,如果我在最后一个i
中运行循环,它将覆盖整个列,而不是仅使用ind
所指示的位置。为什么?
答案 0 :(得分:1)
您可以将日期格式设置为%m-%d
,并使用字符串比较
df$value <- as.numeric(format(df$date, '%m-%d') %between% c('07-15', '12-31'))
df
# date value
# 1 2015-04-16 0
# 2 2014-08-04 1
# 3 2013-09-11 1
# 4 2015-11-20 1
# 5 2014-04-04 0
答案 1 :(得分:0)
df$leapyear <- ifelse(as.integer(format(df$date, "%Y")) %% 4 == 0, 1, 0)
df$leapyear <- ifelse(as.integer(format(df$date, "%Y")) %% 100 == 0, 0, 1)
df$leapyear <- ifelse(as.integer(format(df$date, "%Y")) %% 400 == 0, 1, 0)
df[format(df$date, "%j") > ifelse(df$leapyear == 0, 197, 196), ]
感谢@RyanD指出基于年份的子集未考虑take年