2014-09-05 6 views
0

У меня есть набор данных с двумя значениями для каждого date, как это:R: данные экстракт на основе даты, «если дата меньше, чем»

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

Можете ли вы использовать воспроизводимый набор данных, как вы видите при вводе 'data()'? Кстати, что вы подразумеваете под «форматом» ... вы имеете в виду что-то о классе? 'as.Date' является базовой функцией, если я правильно понимаю, но это не класс, а формат задается оператором' origin' ... –

+0

Я привел данные примера с: 'date = c (" 2013 -05-01 "," 2013-05-02 "," 2013-05-03 "," 2013-05-04 ") x = c (1,2,3,4) y = c (2, 2,2,2) библиотека (lubridate) date = as.Date (as.character (date), format = "% Y-% m-% d") data = data.frame (date, x, у) ' , для которого выше, будет, например, изменения в: ' означают = (х + у)/2 NewData = IfElse ((дата <2013-05-02 | дата> 2013-05-03), среднее значение, x) ' – Anne

+0

и да, я имел в виду класс.Еще новичок в R, извините :) typing 'class (date)' приводит к 'Date' – Anne

ответ

4

Ваш код работает нормально. Кроме того, похоже, что вы не ставите значения сравнения в качестве дат. Также даты, которые вы использовали для сравнения, не исключают ни одной из дат в предоставленном вами кадре данных, поэтому я ожидаю, что среднее значение будет выбрано каждый раз.

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

+0

Вы нашли ошибку в моем коде. Выбрали это как ответ, поскольку он исправил то, что я уже сделал, и его хороший и короткий. Благодаря! – Anne

+0

Рад помочь :) –

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.

+0

'lubridate' не был необходим, но я включил его для функции' ymd' и в случае, если вы используете его для других целей. – nrussell

+0

это сработало, спасибо :) – Anne