2014-09-05 9 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 패키지 lubridate를 사용하여 형식 as.Date입니다.

이제는 의 값을 사용하고 싶습니다. 특정 시간 범위를 제외하고는 x의 값을 사용하고 싶습니다.

mean=(x+y)/2 

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

하지만 경우

그냥 모든 날짜의 mean를 취할 것입니다 :

나는 다음 시도했다.

날짜에 관계를 더 크게 또는 작게 사용할 수 있습니까? 이 작업을 수행하는 방법에 대한 제안 사항이 있으십니까? 이런 일에 대해 어떻게

+0

'data() '를 입력 할 때 볼 수있는 것과 같은 재현 가능한 데이터 세트를 사용할 수 있습니까? BTW, "형식"이란 무엇을 의미합니까 ... 수업에 대해 뭔가 의미가 있습니까? '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, data = data.frame (날짜, x, y, y) Y) ' 는 위해 상기 실시 예를 변경 것이다 : <| 날짜 2013년 5월 2일> 2013년 5월 3일 는'= (X + Y)/2 newData의 ifelse = ((날짜를 의미), 평균, x)' – Anne

+0

예, 나는 수업을 의미했습니다.아직 R이 처음이다. 미안하다. '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") 
## 

을 편집은 - 난 그냥 일 연속 시퀀스로 xSpan을 정의 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 

에 의해 그룹에 잊었다 어떤 함수가 사용되는지 (예제에서, x). 이 시간 범위에 포함되지 않은 날짜는 mean을 사용하여 z의 값을 결정합니다.

+0

'lubridate'는 필요하지 않지만'ymd' 함수와 다른 용도로 사용하는 경우에 포함 시켰습니다. – nrussell

+0

이 작업, 고마워 :) – Anne

관련 문제