R:根据日期提取数据,“如果日期小于”

时间:2014-09-05 15:41:46

标签: r date if-statement as.date

我有一个数据集,每个date有两个值,如下所示:

    date        x   y
1   2013-05-01  1   2
2   2013-05-02  2   2
3   2013-05-03  3   2

date采用as.Date格式,使用包lubridate

现在我希望得到两个值的mean,除了特定的时间跨度,我想要使用x的值。

我尝试了以下内容:

mean=(x+y)/2

newdata=ifelse((data$date < 2013-10-01 | date$date > 2014-04-09), mean, x)

但是如果只是mean所有日期。

是否可以使用比日期更大/更小的关系? 关于如何使这项工作的任何建议?

提前致谢

2 个答案:

答案 0 :(得分:4)

看起来您没有将比较值转换为日期。您用于比较的日期也不排除您提供的数据框中的任何日期,因此我希望每次都选择均值。

date <- as.Date(c('2013-05-01', '2013-05-02', '2013-05-03'))
x    <- c(1, 2, 3)
y    <- c(2, 2, 2)
mean <- (x + y)/2
df   <- data.frame(date = date, x = x, y = y)
newdata <- ifelse((df$date < as.Date('2013-05-02') | df$date > as.Date('2014-04-09')), mean, x)

newdata

我将条件中的日期更改为更具选择性,我得到了1.5 2.0 3.0。它从mean中选择第一个值,从x中选择其他值,这与我在ifelse()中使用的条件一致。

答案 1 :(得分:2)

这样的事情怎么样:

library(lubridate)
library(data.table)
##
set.seed(123)
Data <- data.frame(
  date=as.Date(ymd(20130904))+0:364,
  x=as.numeric(sample(1:3,365,replace=TRUE)),
  y=as.numeric(sample(1:3,365,replace=TRUE)))
setDT(Data)
##
xSpan <- seq.Date(
  from=as.Date("2013-10-01"),
  to=as.Date("2014-04-09"),
  by="day")
##

已修改 - 忘记按date分组

Data[,z:=ifelse(
  date %in% xSpan,
  x,
  mean(c(x,y))),
  by=date]
##
> head(Data)
         date x y   z
1: 2013-09-04 1 3 2.0
2: 2013-09-05 3 1 2.0
3: 2013-09-06 2 1 1.5
4: 2013-09-07 3 2 2.5
5: 2013-09-08 3 2 2.5
6: 2013-09-09 1 2 1.5
> head(subset(Data, date %in% xSpan))
         date x y z
1: 2013-10-01 2 3 2
2: 2013-10-02 1 3 1
3: 2013-10-03 1 1 1
4: 2013-10-04 3 1 3
5: 2013-10-05 3 1 3
6: 2013-10-06 3 1 3

我刚刚将xSpan定义为一个连续的天数序列,其中使用了其中一个函数(在您的示例中,只是x的标识函数)。未包含在此时间范围内的日期将使用mean来确定其z的值。