2011-09-12 4 views
2

두 번째 d $ 연도가 1이 아닌 것을 설명 할 수 있습니까? 이와R POSIXlt의 이상 출력

> d = as.POSIXlt("1900-01-01") 
> d$year 
[1] 0 
> d$mon = d$mon + 12 
> d 
[1] "1901-01-01" 
> d$year 
[1] 0 
> 

대비 :

> d = as.POSIXlt("1900-01-01") 
> d 
[1] "1900-01-01" 
> d$year 
[1] 0 
> d$year = d$year + 1 
> d 
[1] "1901-01-01" 
> d$year 
[1] 1 
> 

답변

2

POSIXlt 오브젝트리스트이다. 목록의 mon 요소를 변경했습니다. 목록의 year 요소는 변경되지 않습니다. 당신이 당신의 변화가 어떤을 변경하려는 경우

d <- as.POSIXlt("1900-01-01") 
unclass(d) 
d$mon <- 12 
unclass(d) 

/다른 목록의 모든 요소는, 다시 POSIXltPOSIXct로 변환.

unclass(as.POSIXlt(as.POSIXct(d))) 
3

직접 목록 (POSIXlt 객체)의 요소를 조작하고 있기 때문입니다. 인쇄되면 "실제"날짜로 표준화되지만 개별 요소에 액세스 할 때 여전히 정규화되지 않은 값을 갖습니다.

가 D < 고려 - as.POSIXlt를 ("1900-01-01") POSIXlt POSIXct 및 후면에 강요하는 것은 그것을 정규화 것을

> d <- as.POSIXlt("1900-01-01") 
> dput(d) 
structure(list(sec = 0, min = 0L, hour = 0L, mday = 1L, mon = 0L, 
    year = 0L, wday = 1L, yday = 0L, isdst = 0L), .Names = c("sec", 
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst" 
), class = c("POSIXlt", "POSIXt")) 
> d$mon <- d$mon + 12 
> dput(d) 
structure(list(sec = 0, min = 0L, hour = 0L, mday = 1L, mon = 12, 
    year = 0L, wday = 1L, yday = 0L, isdst = 0L), .Names = c("sec", 
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst" 
), class = c("POSIXlt", "POSIXt")) 
> d <- as.POSIXlt(as.POSIXct(d)) 
> dput(d) 
structure(list(sec = 0, min = 0L, hour = 0L, mday = 1L, mon = 0L, 
    year = 1L, wday = 2L, yday = 0L, isdst = 0L), .Names = c("sec", 
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst" 
), class = c("POSIXlt", "POSIXt"), tzone = c("", "PST", "PDT" 
)) 

주 제공

dput(d) 
d$mon <- d$mon + 12 
dput(d) 
d <- as.POSIXlt(as.POSIXct(d)) 
dput(d) 

(년 1은 월, 0은 0)

+0

그렇다면 왜이 작업을 원하니? 적절한시기에 수개월이 지나면 어떨까요? – blindjesse

+6

왜냐하면'POSIXlt'은 S3 클래스이기 때문에 데이터 보호보다는 디스패치를 ​​위해 더 많이 설계된 클래스 시스템입니다 (어떤 객체 지향 디자인과 달리). 즉, 클래스의 일부를 직접 조작 할 수 있습니다 (실제로는 목록). "유효하지 않은"오브젝트가 만들어 지더라도 마찬가지입니다. 12 개월 후에 날짜를 만드는 함수가 아니며 목록의'mon' 요소를 직접 가져 와서 12를 더합니다. 다른 말로하면, 클래스 전체에서 작업하지 않고 객체의 한 부분을 직접 변경하는 것입니다. 다른 접근법을 위해'lubridate' 패키지를보십시오. –