0

我有一个数据集,每个数据集都有两个值,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所有日期。

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

提前致谢

4

2 回答 2

8

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

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().

于 2014-09-05T16:08:43.923 回答
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

于 2014-09-05T15:59:41.423 回答