我有一个数据集,每个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
所有日期。
是否可以使用比日期更大/更小的关系? 关于如何使这项工作的任何建议?
提前致谢
答案 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
的值。