2016-10-11 3 views
-1

있는 상태에서 기존 날짜 시작으로 7 일 추가나는이 형식의 데이터 프레임이 R

df1: 
Date   Week Visitors 
2016-09-25 40  100 
2016-10-02 41  200 
. 
. 
2016-12-25 52  600 
2017-01-08 01  500 
2017-01-15 02  1000 
2017-01-22 03  2000 
. 
. 

내가 일로부터 7 일 빼기 싶습니다을 때 주 == 1 일 (2017-01-08)> = 7입니다.

내 데이터 프레임은 다음과 같습니다

df1: 
Date   Week Visitors 
2016-09-25 40  100 
2016-10-02 41  200 
. 
. 
2016-12-25 01  600 
2017-01-01 01  500 
2017-01-08 02  1000 
2017-01-15 03  2000 
. 
. 

는 사람이 올바른 방향으로 날 지점 수 있습니까?

+1

올바르게 이해한다면,'df1 %> % mutate (날짜 = if_else (주> = 1 | lubridate :: day (날짜)> = 7, 날짜 - 7, 날짜))' – alistaire

+0

@alistaire 2017-01-08에서 2017-01-01로 변경하십시오. 해당 날짜 이후에 각 날짜를 7 씩 감소시키고 싶습니다. 2017-01-15는 2017-01-08로 변경해야하며 데이터 프레임의 마지막 행 –

+0

까지 변경해야합니다. 나는 당신이'&'또는'|'를 원한다면 확신하지 못한다. 그러나 주가 1보다 크거나 같거나 일이 7보다 크거나 같으면 조건은 참이다. 날짜가 나중에 2017-01-08이 필요합니다.이 경우에는'Date> = as.Date ('2017-01-08')' – alistaire

답변

1

내가 생각하는 것과 크게 다른 것으로 밝혀 졌다고 생각합니다. 그래서 제 대답을 편집했습니다. 나는 당신이 쫓고있는 것이 매해 수표라고 생각합니다. 그 해의 "Week == 1"이 Jan-07 이전 일 경우, 첫 번째 주가 "missing"이라고 가정하고, 모든 날짜를 움직여서 행동하십시오. 뒤로 7 일. 이것이 달성 될 수있는 방법이 있습니다. 우리가 누락 된 첫 주를 확인하는 함수를 정의 할 것, 그리고

library(data.table) 
setDT(df1) 
df1[ , Year := format(Date, "%Y") 
    ] 

하고, 필요한 경우 날짜를 이동 :

첫째, 우리는 열이 단지 연도를 지정 할 수 있도록합니다

checkAndMove <- function(d, w) { 
    month.day <- as.integer(format(d, "%m%d")) 
    if(month.day[ w == 1 ] > 0106) { 
     d <- d - 7 
    } 
    return(d) 
} 

그런 다음, 우리는 당신의 선택의 한 해에이 기능을 적용 할 수 있습니다 :

df1[ Year == 2017, Date := checkAndMove(d = Date, w = Week) ] 

또는, 우리

df1[ , Date := checkAndMove(d = Date, w = Week), by = Year ] 

참고 : 함수가 적절한 그것을하다고 판단되는 경우에만 R 변경 사항을 적용, 한 번에 모든 년 동안 검사를 실행하도록 할 수 있습니다 내가 작업에 많은 데이터를 가지고 있지 않기 때문에 나는이 코드를 테스트하지 않았습니다 와. 좀 더 많은 데이터를 제공 할 수 있다면 테스트를 실행하여 예상대로 작동하는지 확인하게되어 기쁩니다.

+0

새해 첫 주에 2017-01-01에서 2017-01-06 사이의 어느 곳에서든지 시작할 수 있지만 2017-01-06 이후 첫 주에 시작하면 첫 주에 누락이 있습니다. –

관련 문제