2016-09-12 2 views
1

R에서 as.Date 함수로 작업 할 때 문제가 있습니다. .csv 파일에서 읽는 날짜의 벡터가 정수 또는 문자로 들어옵니다 (어떻게 파일을 읽었는지,이 문제와 관련이없는 것 같습니다.) %m/%d/%Y으로 포맷합니다.as.Date가 'double'유형으로 반환되는 이유는 무엇입니까?

내가 날짜 필드를 잡아 당겨, ​​행에 의해 파일 행을 통과하고 다른 곳에서 다음 코드를 사용하여 사용할 수 있도록 변환 할 노력하고있어, 이것은 내가 원하는 걸 줄 것으로 보인다

tmpDtm<-as.Date(as.character(tempDF$myDate), "%m/%d/%Y") 

을 예를 들어 2014 년 12 월 30 일 시작 값으로이 작업을 수행하면 "2014-12-30" 값이 반환됩니다. 그러나이 값을 typeof()을 사용하여 검사하면 R은 데이터 유형이 'double'이라고 알려줍니다. 또한이 값을 다른 값에 바인딩하고 c() 또는 cbind()을 사용하여 데이터 프레임에 저장하려고하면 데이터 프레임에 16434로 저장되는데 이는 내게 다른 종류의 내부 저장소 값 날짜. as.Date()을 사용하여 해당 값을 다시 변환하려고하면 원본을 요청하는 오류가 발생하기 때문에 그 이유는 확실합니다.

그래서 두 가지 질문 : 예상대로입니까? 그렇다면 실제로 날짜 형 객체로 끝나기 위해 날짜를 변환하는보다 적절한 방법이 있습니까?

감사합니다

+0

재현 예를 확인하십시오 데이터를 가지고 어떤 종류의 당신'C()'또는'cbind()'그것이 알고 당신을인가하는 그 벡터의 모든 항목? 같은 유형이어야합니다? – Bernhard

+0

나는 그것을 알고있다. 명확하지 않은 것에 대해 사과드립니다.하지만 바인딩을 시도하기 전에 데이터 유형이 두 배입니다 (즉, 위의 tmpDtm 객체는 double 유형입니다). 바인딩 문제는 나에게 덜 관심사입니다. 바인드 전에 날짜 객체가 있는지 확인하면 필요한 방식으로 다른 데이터에 바인딩하는 방법을 알 수 있습니다. 추가 정보가 도움이 될 것이라고 생각했습니다. 내가 바인딩을하기 전에 전환으로 어떤 일이 일어나고 있는지 확인하는 것입니다. – drRussClay

+0

두 함수의 미묘한 차이는 개인적으로 알지 못하지만'typeof' 대신'class'를 사용해보십시오. 전자는'Date'를 리턴하는 반면 후자는'double'을 리턴합니다. – dsaxton

답변

5

다음의 예에서 볼 수 있듯이 날짜가 내부적으로 더블로 표시됩니다 :

> typeof(as.Date("09/12/16", "%m/%d/%y")) 
[1] "double" 

는 여전히 클래스 날짜 표시되어 같이

> class(as.Date("09/12/16", "%m/%d/%y")) 
[1] "Date" 

두 배이기 때문에 계산을 할 수 있습니다. 이 클래스 업데이트 날짜이기 때문에 그러나, 이러한 계산은 날짜로 이어질 : 그들이 어떤 이상한 행동 assciated 수 있기 때문에

> as.Date("09/12/16", "%m/%d/%y") + 1 
[1] "2016-09-13" 
> as.Date("09/12/16", "%m/%d/%y") + 31 
[1] "2016-10-13" 

편집 나는, c()cbind()을 요청했다. - c()cbind 힘 개체 한 형으로 2

> c(as.Date("09/12/16", "%m/%d/%y"), 1) 
[1] "2016-09-12" "1970-01-02" 
> c(1, as.Date("09/12/16", "%m/%d/%y")) 
[1]  1 17056 

> class(c(as.Date("09/12/16", "%m/%d/%y"), 1)) 
[1] "Date" 
> class(c(1, as.Date("09/12/16", "%m/%d/%y"))) 
[1] "numeric" 

EDIT : c 변경되지 유형하지만 결과의 클래스 내의 순서를 전환 한 경우, 다음의 예를 참조. 첫 번째 편집은 강요의 예외를 보여 주지만, 일반적으로 벡터는 하나의 공유 된 유형이어야합니다. cbind은 행렬에 강제 변환하기 때문에이 동작을 공유합니다. 행렬은 단일 유형으로 변환됩니다.

typeof 방법에 대한 자세한 내용은

class이 예상대로 this link

+0

'methods ("c")'를 확인하십시오. S3 시스템에서는 첫 번째 인수의 클래스가 어떤 메소드가 사용되는지 결정합니다. 그리고'c'와'cbind'는 모두 S3 generics입니다. 순서에 관계없이 같은 결과를 얻으려면 S4 클래스를 사용해야합니다. S4 클래스는 모든 인수의 서명에 따라 메소드를 전달할 수 있습니다. – Roland

2

를 참조하십시오.당신은 typeof()을 사용했습니다. 당신은 아마 class()을 사용한다 :

R> Sys.Date() 
[1] "2016-09-12" 
R> typeof(Sys.Date())  # this more or less gives you how it is stored 
[1] "double" 
R> class(Sys.Date())  # where as this gives you _behaviour_ 
[1] "Date" 
R> 

마이너 광고 : 나는 anydate()을 통해 (이은 (anytime()를 통해) POSIXct에 "아무것도"또는 날짜를 변환으로 다루는 CRAN에서 들어오는 현재, 새로운 패키지 anytime이 .

예 :.

R> anydate("12/30/2014")    # no format needed 
[1] "2014-12-30" 
R> anydate(as.factor("12/30/2014")) # converts from factor too 
[1] "2014-12-30" 
R> 
+1

'anytime'을 기대합니다! – SymbolixAU

+1

지금은 CRAN에 있습니다 :) –

관련 문제