2014-09-05 84 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'語句給出... – 2014-09-05 15:55:02

+0

我製作了示例數據: 'date = c(「2013 (2,3,4) y = c(2,-05-01「,」2013-05-02「,」2013-05-03「,」2013-05-04「) x = 2,2,2) library(lubridate) date = as.Date(as.character(date),format =「%Y-%m-%d」) data = data.frame(date,x, Y)' 的量,上述將例如改變: '平均值=(X + Y)/ 2 newdata = ifelse((日期<2013年5月2日|日期> 2013年5月3日),意思是,x)' – Anne 2014-09-05 16:06:02

+0

是的,我的意思是上課。還是新的R,對不起:) 鍵入'類(日期)'結果在'日期' – Anne 2014-09-05 16:10:23

回答

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 2014-09-05 16:24:12

+0

很高興幫助:) – 2014-09-05 16:34:36

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 2014-09-05 16:00:42

+0

這工作,謝謝:) – Anne 2014-09-05 16:20:46