2013-03-07 7 views
14

위치와 날짜가있는 데이터 세트가 있습니다. 나는 주 (week)를 숫자 (00-53)로 계산하고 목요일을주의 첫날로 사용하고 싶습니다. 데이터는 다음과 같습니다년에 주 번호 (0-53)를 계산하십시오.

location <- c(a,b,a,b,a,b) 
    date <- c("04-01-2013","26-01-2013","03-02-2013","09-02-2013","20-02-2013","03-03-2013") 
    mydf <- data.frame(location, date) 
    mydf 

나는 올해의 주 계산의 strftime 기능이 있다는 것을 알고 있지만, 월요일 일요일은 한주의 첫 번째 요일로 사용할에만 가능합니다. 도움을 주시면 감사하겠습니다.

+0

내가 물어볼 수 있다면 왜 그렇게하고 싶습니까? – Arun

+3

그래서 1 년이 화요일에 시작하면 주 1은 화요일/수요일이고 주 2는 목요일에 시작됩니다 ...? – joran

+0

예. 주간은 화요일부터 수요일까지 포함되어야합니다. – Eco06

답변

22

그냥 날짜 형식의 값에 4를 추가

> mydf$Dt <- as.Date(mydf$date, format="%d-%m-%Y") 
> weeknum <- as.numeric(format(mydf$Dt+3, "%U")) 
> weeknum 
[1] 1 4 5 6 7 9 

이는 0을 기반으로 계산 규칙을 ​​사용하는이의 첫 번째 금요일은 strftime가 제공하고 우리가 그 코드베이스를 편승하는 것입니다, 그래서 때문에 2013 년의 경우와 마찬가지로 화요일에 시작하는 연도는 1 주 결과가됩니다. 1 기반 규칙을 원하면 값에 1을 더하십시오. (근본적으로 날짜 생성 값은 "원점"의 정수 시퀀스이므로 실제로는 몇 년 또는 몇 주를 인식하지 못합니다 .4를 추가하면 기본 날짜 - 정수의 참조 프레임 만 이동합니다.)

메모 편집. Gabor의 조언에 따라 세 가지 전략이 추가되었습니다. .... 아직도 전년도 마지막 주를 다루는 방법에 관한 문제를 다루지 않습니다.

+1

주 번호의 정의가 무엇인지에 대한 질문이 있습니다. 질문에있는 6 개의 날짜 이전의 1 년, 4, 5, 6, 7, 9 목요일에 어떤 비율이든 각각 8 개가 맞는지 여부에 대한 질문이 제기됩니다. 또한 형식 (.Date ("2013-12-31") + 4, "% U")은 00을 제공합니다. –

+0

"add-4"전략은 목요일에 증분을 생성하므로 목요일 수가 일치합니다 "add-3"전략. –

+0

년말 문제에 대한 해결책은 12 월에 7 일을 뺀 다음 주 수에 1을 더하는 것일 수 있습니다. 'ifelse (months (d) == "December") \t.numeric (format d-4, "% U")) + 1, \t as.numeric (형식 (d + 3, "% U")))' –

2

주에 00-53이 나오는 질문에 주 번호는 해당 날짜 또는 그 이전의 해에있는 목요일 수라고 가정합니다. 따라서 올해 첫 번째 목요일은 1 주에 시작하고 0 주일은 그 이전의 모든 요일에 할당됩니다.

(첫 번째 날이 화요일이면 1 주일이지만 그 경우에는 주제에 필요하지 않은 것으로서 주 0이 될 수 없다고하는 의견이있었습니다. 따라서 정확하게 주 번호의 정의가 필요할 수도 있습니다. 여기에서는 이전 단락의 정의를 사용 하겠지만 정의가 무엇인지 알면 변경하기가 어려울 것입니다. 예를 들어, 첫 주 짧은 주 였더라도 1 년이 될 것이므로 결과에 !is.thu(jan1(d))을 추가 할 수 있습니다.)

아래의 두 가지 해결 방법은 한 문장으로 표현할 수있을만큼 짧습니다. 그러나 우리는 각각의 기능을 명확하게하기 위해 몇 가지 간단한 기능으로 분해했습니다. 첫 번째는 특히 직선이지만 두 번째는 sapply이 필요없이 자동으로 벡터화되며 더 효율적입니다. 이 솔루션은 입력 d을 가정 해에

1. 합 목요일 클래스 "Date"이며 직전 또는 그것에 년에 목요일의 수를 요약 :

is.thu <- function(x) weekdays(x) == "Thursday" 
jan1 <- function(x) as.Date(cut(x, "year")) 

week4 <- function(d) { 
    sapply(d, function(d) sum(is.thu(seq(jan1(d), d, by = "day")))) 
} 

우리는 다음과 같이 테스트 할 수 :

d <- as.Date(c("2013-01-04", "2013-01-26", "2013-02-03", "2013-02-09", 
    "2013-02-20", "2013-03-03")) 
week4(d) # 1 4 5 6 7 9 

2 nextthu

zoo quickref vignette에있는 nextfri 함수를 기반으로하면 다음 주일 (또는 이미 목요일 인 경우 해당 날짜)의 Epoch (1970-01-01) 이후의 일 수는 nextthu의 첫 번째 숫자 아래 줄.두 번째 솔루션 고정 버그 : 테스트

week4a(d) # 1 4 5 6 7 9 

ADDED에게 여기

nextthu <- function(d) 7 * ceiling(as.numeric(d)/7) 

week4a <- function(d) (as.numeric(d) - nextthu(jan1(d))) %/% 7 + 1 

된다 : 올해의 첫날이 적용 우리는 d가 이전되는 결과를 도출.