2015-05-06 10 views
5

używam strtoi określić tydzień roku w następujących funkcji:R - strtoi dziwne zachowanie dostać tydzień roku

to.week <- function(x) strtoi(format(x, "%W")) 

To działa dobrze dla większości terminach:

> to.week(as.Date("2015-01-11")) 
[1] 1 

jednak gdy próbuję dat między 2015-02-23 i 2015-03-08, otrzymuję NA w wyniku:

> to.week(as.Date("2015-02-25")) 
[1] NA 

Czy mógłbyś wyjaśnić mi, co powoduje problem?

+0

@ rmuc8, nie do końca, gdyż jest to pytanie, dlaczego jego podejście nie działa, zamiast, jak to zrobić ogólnie. – BrodieG

Odpowiedz

6

Oto implementacja że działa:

to.week <- function(x) as.integer(format(x, "%W")) 

Powodem strtoi nie jest domyślnie próbuje interpretować numery jakby byli ósemkowy, gdy są one poprzedzane "0". Od "%W" zwraca "08", a 8 nie istnieje w ósemkowym, otrzymasz NA. Od ?strtoi:

Konwertuj łańcuchy na liczby całkowite zgodnie z podaną bazą, używając funkcji C strtol, lub wybierz odpowiednią bazę zgodnie z regułami C.

...

Na strunach przecinku as.integer jest równie przydatna.

Ponadto, można użyć:

week(as.Date("2015-02-25")) 

Choć może trzeba zrównoważyć wynik, że o 1 do własnych oczekiwań.

+0

Dziękuję za wyjaśnienie. – paljenczy

+2

Wyjaśnienia wydają mi się niepełne. Faktem jest, że istnieje wiodący "0" w wyniku z formatu.Data, która powoduje problemy. 'format (as.Date (" 2010-02-26 "),"% W ") [1]" 08 "'. Funkcja 'strtoi' nie interpretuje" 10 "jako liczby dziesiętnej 8. –

+0

@BondedDust, masz rację, zostanie zaktualizowany. – BrodieG

4

można nieco zmodyfikować kod jak ten

to.week <- function(x) strtoi(format(x, "%W"), 10) 

i używać podstawy 10.

+0

Dziękujemy, warto wiedzieć! – paljenczy