【发布时间】:2019-03-15 15:44:38
【问题描述】:
我从以下问题开始寻求泛化性质: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 指示的位置。为什么?
【问题讨论】:
-
你的 for 循环只运行了 1 次。正确的说法应该是:
for(i in 1:length(begi) )。有关解决此问题的更好方法,请参阅下面的答案。
标签: r date if-statement