2016-06-07 2 views
0

데이터 숫자의 숫자로 변환하려는 문자 형식의 데이터 숫자가 있습니다. 그러나 문제는 숫자가 매우 긴 것을 내가는 data.table의 examle 처음 5 개 요소의 R.에서 반올림없이 모든 숫자를 유지하려면 : 나는 변환하는 기능을 썼다문자에서 숫자로 변환 할 때 반올림 오류가 발생했습니다.

> TimeO[1] 
[1] "20110630224701281482" 
> TimeO[2] 
[1] "20110630224701281523" 
> TimeO[3] 
[1] "20110630224701281533" 
> TimeO[4] 
[1] "20110630224701281548" 
> TimeO[5] 
[1] "20110630224701281762" 

문자에서 숫자로 :

convert_time_fast <- function(tim){ 
    b <- tim - tim%/%10^12*10^12 
    # hhmmssffffff 
    ms <- b%%10^6; b <-(b-ms)/10^6 
    ss <- b%%10^2; b <-(b-ss)/10^2 
    mm <- b%%10^2; hh <-(b-mm)/10^2 
    # if hours>=22, subtract 24 (previous day) 
    hh <- hh - (hh>=22)*24 
    return(hh+mm/60+ss/3600+ms/(3600*10^6)) 
} 

그러나 반올림은 R에서 발생하므로 데이터 포인트가 이제는 같은 시간을 갖습니다. 변환 후 처음 5 개 요소를 확인하십시오 :

TimeOC <--convert_time_fast(as.numeric(TimeO)) 
> TimeOC[1] 
[1] 1.216311 
> TimeOC[2] 
[1] 1.216311 
> TimeOC[3] 
[1] 1.216311 
> TimeOC[4] 
[1] 1.216311 
> TimeOC[5] 
[1] 1.216311 

이 문제를 이해하면 도움이 될 것입니다.

답변

0

실제적으로 동일한 지 테스트해야합니다 (all.equal()).
일반적으로 R은 인쇄 할 자릿수를 제한하며 (일반적으로 7 자까지), 여전히 그대로 있습니다.

또한이 예를 참조하십시오

> as.numeric("1.21631114") 
[1] 1.216311 
> as.numeric("1.21631118") 
[1] 1.216311 
> all.equal(as.numeric("1.21631114"), as.numeric("1.21631118")) 
[1] "Mean relative difference: 3.288632e-08" # which indicates they're not the same 
+0

문제는 내가 데이터 포인트를 그래프로 노력하고 내가 그것을 all.equal 않을 경우 같은 시간에 지점이 서로 – CheddaShredda

+0

위에 그려되고 있다는 점이다 TRUE라고 말하면 실제 변환 함수에 문제가 있다고 생각합니다. – CheddaShredda

+0

이 문제도 발생했습니다. 소수 자릿수가 많은 문자를 숫자로 변환합니다. 소수 자리와 그 이후의 문제가 없어집니다. 대답이있는 사람을위한 대규모 upvote. :-) – roman

관련 문제